🔥博客主页:小王又困了
📚系列专栏:每日一练
🌟人之为学,不日近则日退
❤️感谢大家点赞👍收藏⭐评论✍️
目录
一、选择题
📝1.第一题
📝2.第二题
📝3.第三题
二、编程题
📝1.第一题
📒方法一:
📒方法二:
📝2.第二题
🗒️前言:
在前面我们学习完C语言的所以知识,当然练习巩固也不能落下。俗话说:“无财之谓贫,学而不能行之谓病。”可见实践对我们学习的重要。接下来就让小王带着大家进行练习,巩固我们C语言的学习。
一、选择题
📝1.第一题
以下哪个选项一定可以将flag的第二个bit置0()
A. flag&=~2
B. flag|=2
C. flag^=2
D. flag>>=2
💡解题思路:
我们要将某一位置为0,只需要在这一位按位与一个0,其他位都为1即可。
- & -- 对应的二进制位有0则为0,都为1才为1
假设 flag 有8个比特位,那么只要按位与11111101,就可以将第二个比特位置为0。想得到11111101只需将00000010按位取反即可,也就是A选项。
📝2.第二题
执行下面程序,正确的输出是( )
int x = 5, y = 7;
void swap()
{
int z;
z = x;
x = y;
y = z;
}
int main()
{
int x = 3, y = 8;
swap();
printf("%d,%d\n",x, y);
return 0;
}
💡解题思路:
通过观察代码我们看到在程序中定义了变量名相同的全局变量和局部变量,当同名时,局部变量优先使用。在 main 函数中有一个交换函数,但没有传递参数,所以它无法交换局部变量 x,y。全局变量的作用域是整个程序的生命周期,所以这里交换的是全局变量 x,y的值。在打印时,局部变量要优先使用,所以打印出的结果是3,8。
📝3.第三题
下面函数的输出结果是()
void func()
{
int k = 1^(1 << 31 >> 31);
printf("%d\n", k);
}
💡解题思路:
通过观察代码,第一步是将1向左移动31位,然后将结果向右移动31位,最后将得到的结果 ^ 1就得到k。移位操作符的规则:
- << -- 左移
左边丢弃,右边补0
- >> -- 右移
1.算术右移:右边丢弃,左边补原来的符号位
2.逻辑右移:右边丢弃,左边直接补0
本题的右移是算数右移。
二、编程题
📝1.第一题
📒方法一:
💡解题思路:
我们可以将数字按照字符串的形式接收scanf("%s",str) ,然后将数据倒着打印出来。
- 倒着打印的方法:计算出字符串的长度,从最后一个下标开始,依次向前打印
#include <stdio.h> #include <string.h> int main() { char str[32] = { 0 }; while (scanf("%s", str) != EOF) { int len = strlen(str); int i = 0; for (i = len-1; i >= 0; i--) { printf("%c", str[i]); } printf("\n"); } return 0; }
📒方法二:
💡解题思路:
我们就按照数字输入,每次通过 ‘%10’ 得到最后一位,由于题目要求要按照字符的形式打印,所以在打印时要加 ‘0’ 然后输出。这里要考虑输入的值为0时,直接打印‘0’。
int main() { int n = 0; while (scanf("%d", &n) != EOF) { if (n == 0) { printf("%c", '0'); } while (n) { printf("%c", n % 10 + '0'); n /= 10; } printf("\n"); } return 0; }
📝2.第二题
💡解题思路:
因为题目将数组边界看成最小值,而我们只需要找到其中一个波峰,因此只要不断地往高处走,一定会有波峰。那我们可以每次找到中间元素,将数组分成两个区间,每次就较高的一边走。同时题目还要求时间复杂度为log(N)可以使用二分产找确定中间元素。
- 先通过二分查找,找到中间元素
- 如果中间元素大于右侧元素,说明右边是向下走,不一定会遇到波峰,所以我们在左侧继续寻找中间值
- 如果中间元素小于右侧元素,说明右边是向上走,一定会遇到波峰,所以我们在又侧继续寻找中间值
- 当首尾相遇时,这个点就是波峰
注意:由于只需要找一个波峰,所以我们找一侧对比就可以,这里是和右侧数据对比。
int findPeakElement(int* nums, int numsLen) { int left = 0; int right = numsLen - 1; while (left < right) { int mid = (left + right) / 2; if (nums[mid] < nums[mid + 1]) { left = mid + 1; } else { right = mid; } } return right; }
本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。