🔥博客主頁:小王又困了
📚系列專欄:每日一練
🌟人之為學,不日近則日退?
??感謝大家點贊👍收藏?評論??
目錄
?一、選擇題
📝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; }
本次的內容到這里就結束啦。希望大家閱讀完可以有所收獲,同時也感謝各位讀者三連支持。文章有問題可以在評論區留言,博主一定認真認真修改,以后寫出更好的文章。你們的支持就是博主最大的動力。