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

一、程序设计经典编程题(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值