当前位置: 首页 > article >正文

考研笔试/上机经典编程题集合(持续更新并完善解题思路)

目录

  • 一、程序设计经典编程题(C语言实现)
    • 1.1 判断一个字符串是否由另一个字符串旋转得到
    • 1.2 字符串左旋
    • 1.3 求最大公约数以及最小公倍数
  • 二、力扣
    • 2.1 面试题 17.04. 消失的数字
  • 三、牛客网
    • 3.1 OR62 倒置字符串

一、程序设计经典编程题(C语言实现)

1.1 判断一个字符串是否由另一个字符串旋转得到

1.2 字符串左旋

  • 题目描述:
    在这里插入图片描述

1.3 求最大公约数以及最小公倍数

可以参考本博客
可以用初中数学理解一下辗转相除法

二、力扣

2.1 面试题 17.04. 消失的数字

题目链接

  1. 解法一:首先^遵循交换律 且0^N=N N^N=0 把所有的元素都^起来 相同的都成0 剩下一个单独的 就是消失的数字 相当于找单身狗
  2. 解法二:既然题目描述里的n 其实应该等于numsSize 也就是我应该有的元素是0,1,2,3,4,n(numsSize) 把他们全都加起来去减数组的值 结果就是那个孤儿
  3. 解法二还可以优化 1-n求和直接用公式 都不需要遍历
//我的代码:
int missingNumber(int* nums, int numsSize) {
    int ret = 0;
    int sum = 0;
    for (int i = 0; i < numsSize; i++) {
        scanf("%d", &nums[i]);
        ret = ret ^ nums[i];
        ret = ret ^ i;
    }
    ret = ret ^ numsSize;

    //思路二:
    // for (int i = 0; i <= numsSize; i++) {
    //     sum += i;
    // }

    // for (int i = 0; i < numsSize; i++) {
    //     scanf("%d", &nums[i]);
    //     sum -= nums[i];
    // }
    return ret;
}

三、牛客网

3.1 OR62 倒置字符串

题目链接
● 其实最后我觉得 这里让我混淆的最大原因就是 要考虑空格和\0两个情况 尤其是\0
● 而且感觉最难的一步就是想不到要做两步reverse就行
● 然后我肯定就顺着直接输入一个字符串的思路去想了 鹏哥给的思路是两次reverse 我就想实现他的思路
● 其实我的思路就是第一次整体reverse之后 下面肯定要有两个不断变化的指针 每次都指向首元素和末尾元素(我犯了两个错误 在交换每个元素的时候 一个是没有考虑最后一个元素交换时候的\0 还有一个就是空格是不需要交换)
最终我的代码: 详细过程见语雀笔记

#include <stdio.h>
#include<string.h>

void reverse(char* left, char* right) {
    while (left < right) {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}
int main() {
    char arr[100];
    gets(arr);
    //整体reverse
    char* left = arr;
    char* right = arr + strlen(arr) - 1;
    reverse(left, right);

    char* start = arr;//每次记录起始位置
    char* find = arr;//协助寻找末尾位置

//这里必须要定义一个find 相当于临时变量的作用
//要不然的话 会修改start的值 传参就错了
    while (1) {
        //寻找末尾
        while (*find != ' ' && *find != '\0') {
            find++;
        }
        //找到了
        char* end = find - 1;
        //reverse当前锁定的元素
        reverse(start, end);
        //判断是不是最后一次reverse
        if (*find == '\0')
            break;

        //如果不是 更新收尾 继续reverse
        else
            //这里的写法要小心 如果要继续找 那就是先把find++
            //然后再作为下一轮reverse的start的值
            start = ++find;
    }
    printf("%s", arr);
    return 0;
}

http://www.kler.cn/news/341482.html

相关文章:

  • 2024 kali虚拟机安装教程,分两大步骤,图文讲解(1)
  • 云原生日志ELK( logstash安装部署)
  • ABB机器人20195故障报警原因分析
  • 【基础介绍】【OCR】
  • 【微服务】链路追踪 - Micrometer(day9)
  • IT招聘乱象的全面分析
  • 13种pod的状态
  • NL2SQL之DB-GPT-Hub详解篇:text2sql任务的微调框架和基准对比
  • ctfshow-web 萌新题
  • C++——模拟实现list
  • 2.1类和对象(上)
  • useradd命令:添加Linux新用户
  • 学习干货IF=93.6!开发临床预测模型:分步指南
  • 使用 SSH/SFTP 方法来实现 Windows 和 Kali Linux 之间的文件共享(fileZilla)
  • vba学习系列(7)--考勤表制作
  • 【可答疑】基于51单片机的PWM控制智能台灯设计(含仿真、代码、报告、演示视频等)
  • 分布式数据库:大数据时代的关键技术
  • 读论文、学习时 零碎知识点记录01
  • PViT-AIR:一种用于乳腺组织图像配准的深度学习模型|顶刊精析·24-10-10
  • 【大数据】数据分析之Spark框架介绍