以下**可以從陣列a中找出第k小的元素。
它使用了類似快速排序中的分治演算法,期望時間複雜度是o(n)的。
請仔細閱讀分析原始碼,填寫劃線部分缺失的內容。
#include int quick_select(int a, int l, int r, int k)
int i = l, j = r;
while(i < j)
while(i < j && a[j] > x) j--;
if(i < j)
} a[i] = x;
p = i;
if(i - l + 1 == k) return a[i];
if(i - l + 1 < k) return quick_select( _____________________________ ); //填空
else return quick_select(a, l, i - 1, k);
} int main()
; printf("%d\n", quick_select(a, 0, 14, 5));
return 0;
}
注意:只填寫劃線部分缺少的**,不要抄寫已經存在的**或符號。
求1個整數的第k位數字有很多種方法。
以下的方法就是一種。
// 求x用10進製表示時的數字長度
int len(int x)
// 取x的第k位數字
int f(int x, int k)
int main()
對於題目中的測試資料,應該列印5。
請仔細分析原始碼,並補充劃線部分所缺少的**。
注意:只提交缺失的**,不要填寫任何已有內容或說明性的文字。
最大公共子串長度問題就是:
求兩個串的所有子串中能夠匹配上的最大長度是多少。
比如:"abcdkkk" 和 "baabcdadabc",
可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。
下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。
請分析該解法的思路,並補全劃線部分缺失的**。
#include #include #define n 256
int f(const char* s1, const char* s2)
}}return max;
}int main()
排序在各種場合經常被用到。
快速排序是十分常用的高效率的演算法。
其思想是:先選乙個「標尺」,
用它把整個佇列過一遍篩子,
以保證:其左邊的元素都不大於它,其右邊的元素都不小於它。
這樣,排序問題就被分割為兩個子區間。
再分別對子區間排序就可以了。
下面的**是一種實現,請分析並填寫劃線部分缺少的**。
#include void swap(int a, int i, int j)
int partition(int a, int p, int r)
______________________;
return j;
}void quicksort(int a, int p, int r)
for(i=0; i<=a[k]; i++)
void f(int x, int k)
for(i=k;i<9; i++)
f(x,k+1);
_____________________________________________// 填空處
}}int main()
; f(x,0);
return0;
}
交換值之後,呼叫f(x,k+1);之後,要把值交換回來。
對乙個方陣轉置,就是把原來的行號變列號,原來的列號變行號
例如,如下的方陣:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
轉置後變為:
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16
但,如果是對該方陣順時針旋轉(不是轉置),卻是如下結果:
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
下面的**實現的功能就是要把乙個方陣順時針旋轉。
void rotate(int* x, int rank)
for(i=0; ifree(y);}
int main(int argc, char* ar**)
,,,};
int rank = 4;
rotate(&x[0][0], rank);
for(int i=0; iprintf("\n");
} return 0;
}
藍橋杯填空題 剪郵票
如下面第一張圖,有12張連在一起的12生肖的郵票。現在你要從中剪下5張來,要求必須是連著的。僅僅連線乙個角不算相連 具體例子比如第二張,第三張圖中,粉紅色所示部分就是合格的剪取。請你計算,一共有多少種不同的剪取方法。思路 先找到5個數的組合,然後從第乙個數字開始遍歷,經過上下左右操作檢測5個數是否都...
藍橋杯填空題 獎券數目
有些人很迷信數字,比如帶 4 的數字,認為和 死 諧音,就覺得不吉利。雖然這些說法純屬無稽之談,但有時還要迎合大眾的需求。某 活動的獎券號碼是5位數 10000 99999 要求其中不要出現帶 4 的號碼,主辦單位請你計算一下,如果任何兩張獎券不重號,最多可發出獎券多少張。思路 迴圈遍歷每一位數字的...
藍橋杯填空題 加法變乘法
加法變乘法 我們都知道 1 2 3 49 1225 現在要求你把其中兩個不相鄰的加號變成乘號,使得結果為2015 比如 1 2 3 10 11 12 27 28 29 49 2015 就是符合要求的答案。請你尋找另外乙個可能的答案,並把位置靠前的那個乘號左邊的數字提交 對於示例,就是提交10 思路 ...