目录
- 一、程序设计经典编程题(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. 消失的数字
题目链接
解法一:首先^遵循交换律 且0^N=N N^N=0 把所有的元素都^起来 相同的都成0 剩下一个单独的 就是消失的数字 相当于找单身狗
解法二:既然题目描述里的n 其实应该等于numsSize 也就是我应该有的元素是0,1,2,3,4,n(numsSize) 把他们全都加起来去减数组的值 结果就是那个孤儿
解法二还可以优化 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);//整体reversechar* 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);//判断是不是最后一次reverseif (*find == '\0')break;//如果不是 更新收尾 继续reverseelse//这里的写法要小心 如果要继续找 那就是先把find++//然后再作为下一轮reverse的start的值start = ++find;}printf("%s", arr);return 0;
}