??博客主頁:小王又困了
??系列專欄:每日一練
??人之為學(xué),不日近則日退?
??感謝大家點(diǎn)贊??收藏?評論??
目錄
?一、選擇題
??1.第一題
??2.第二題
??3.第三題
二、編程題
??1.第一題
??方法一:
??方法二:
??2.第二題
???前言:
在前面我們學(xué)習(xí)完C語言的所以知識,當(dāng)然練習(xí)鞏固也不能落下。俗話說:“無財(cái)之謂貧,學(xué)而不能行之謂病。”可見實(shí)踐對我們學(xué)習(xí)的重要。接下來就讓小王帶著大家進(jìn)行練習(xí),鞏固我們C語言的學(xué)習(xí)。
?一、選擇題
??1.第一題
以下哪個選項(xiàng)一定可以將flag的第二個bit置0()
A. flag&=~2
B. flag|=2
C. flag^=2
D. flag>>=2
??解題思路:
我們要將某一位置為0,只需要在這一位按位與一個0,其他位都為1即可。
- &? --? 對應(yīng)的二進(jìn)制位有0則為0,都為1才為1
假設(shè) flag 有8個比特位,那么只要按位與11111101,就可以將第二個比特位置為0。想得到11111101只需將00000010按位取反即可,也就是A選項(xiàng)。
??2.第二題
執(zhí)行下面程序,正確的輸出是( )
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;
}
??解題思路:
通過觀察代碼我們看到在程序中定義了變量名相同的全局變量和局部變量,當(dāng)同名時,局部變量優(yōu)先使用。在 main 函數(shù)中有一個交換函數(shù),但沒有傳遞參數(shù),所以它無法交換局部變量 x,y。全局變量的作用域是整個程序的生命周期,所以這里交換的是全局變量 x,y的值。在打印時,局部變量要優(yōu)先使用,所以打印出的結(jié)果是3,8。
??3.第三題
下面函數(shù)的輸出結(jié)果是()
void func()
{
int k = 1^(1 << 31 >> 31);
printf("%d\n", k);
}
??解題思路:
通過觀察代碼,第一步是將1向左移動31位,然后將結(jié)果向右移動31位,最后將得到的結(jié)果 ^ 1就得到k。移位操作符的規(guī)則:
- ?<<? --? 左移
????????左邊丟棄,右邊補(bǔ)0
- >>? --? 右移
????????1.算術(shù)右移:右邊丟棄,左邊補(bǔ)原來的符號位
????????2.邏輯右移:右邊丟棄,左邊直接補(bǔ)0
本題的右移是算數(shù)右移。
二、編程題
??1.第一題
??方法一:
??解題思路:
我們可以將數(shù)字按照字符串的形式接收scanf("%s",str) ,然后將數(shù)據(jù)倒著打印出來。
- 倒著打印的方法:計(jì)算出字符串的長度,從最后一個下標(biāo)開始,依次向前打印
#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; }
??方法二:
??解題思路:
我們就按照數(shù)字輸入,每次通過 ‘%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.第二題
??解題思路:
因?yàn)轭}目將數(shù)組邊界看成最小值,而我們只需要找到其中一個波峰,因此只要不斷地往高處走,一定會有波峰。那我們可以每次找到中間元素,將數(shù)組分成兩個區(qū)間,每次就較高的一邊走。同時題目還要求時間復(fù)雜度為log(N)可以使用二分產(chǎn)找確定中間元素。
- 先通過二分查找,找到中間元素
- 如果中間元素大于右側(cè)元素,說明右邊是向下走,不一定會遇到波峰,所以我們在左側(cè)繼續(xù)尋找中間值
- 如果中間元素小于右側(cè)元素,說明右邊是向上走,一定會遇到波峰,所以我們在又側(cè)繼續(xù)尋找中間值
- 當(dāng)首尾相遇時,這個點(diǎn)就是波峰
注意:由于只需要找一個波峰,所以我們找一側(cè)對比就可以,這里是和右側(cè)數(shù)據(jù)對比。
文章來源:http://www.zghlxwxcb.cn/news/detail-651563.html
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; }
本次的內(nèi)容到這里就結(jié)束啦。希望大家閱讀完可以有所收獲,同時也感謝各位讀者三連支持。文章有問題可以在評論區(qū)留言,博主一定認(rèn)真認(rèn)真修改,以后寫出更好的文章。你們的支持就是博主最大的動力。文章來源地址http://www.zghlxwxcb.cn/news/detail-651563.html
到了這里,關(guān)于拒絕擺爛!C語言練習(xí)打卡第二天的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!