目录
- 一、程序设计经典编程题(C语言实现)
- 1.1 判断一个字符串是否由另一个字符串旋转得到
- 1.2 字符串左旋
- 1.3 求最大公约数以及最小公倍数
- 1.4
- 二、力扣
- 2.1 面试题 17.04. 消失的数字
- 三、牛客网
- 3.1 OR62 倒置字符串
- 3.2 BC84 计算y的值
一、程序设计经典编程题(C语言实现)
1.1 判断一个字符串是否由另一个字符串旋转得到
1.2 字符串左旋
- 题目描述:
1.3 求最大公约数以及最小公倍数
可以参考本博客
可以用初中数学理解一下辗转相除法
1.4
二、力扣
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);
//整体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;
}
3.2 BC84 计算y的值
题目链接
-
那么有的朋友就要问了 这么简单的题放进来侮辱我的智商? 举报点踩拉黑了
-
主要还是因为我第一次写的时候居然写了2个if1个else 一般是讨论单值函数的! 只有一个入口!
-
正确:x和y是一一映射关系 只有一个入口
#include <stdio.h>
int main() {
int x;
int y;
while (scanf("%d", &x) != EOF) {
if (x < 0)
y = 1;
else if (x == 0)
y = 0;
else
y = -1;
printf("%d\n",y);
}
return 0;
}