[剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列
面試題41:和為s的兩個(gè)數(shù)字VS和為s的連續(xù)正數(shù)序列
題目一:輸入一個(gè)遞增排序的數(shù)組和一個(gè)數(shù)字s,在數(shù)組中查找兩個(gè)數(shù),使得它們的和正好是s。如果有多對(duì)數(shù)字的和等于s,輸出任意一對(duì)即可。
代碼如下:
bool FindNumbersWithSum(int data[], int length, int sum, int *num1, int *num2) {bool found = false;if (length < 1 || num1 == nullptr || num2 == nullptr) return found;int ahead = length - 1;int behind = 0;while (ahead > behind){long long curSum = data[ahead] + data[behind];if (curSum == sum){*num1 = data[behind];*num2 = data[ahead];found = true;break;}else if (curSum > sum) ahead--;else behind++;}return found; }測(cè)試用例:
● 功能測(cè)試(數(shù)組中存在和為s的兩個(gè)數(shù),數(shù)組中不存在和為s的兩個(gè)數(shù))
● 特殊輸入測(cè)試(表示數(shù)組的指針為NULL指針)
題目二:輸入一個(gè)正數(shù)s,打印出所有和為s的連續(xù)正數(shù)序列(至少含有兩個(gè)數(shù))。例如輸入15,由于1+2+3+4+5=4+5+6=7+8=15,所以結(jié)果打印出3個(gè)連續(xù)序列1~5、4~6和7~8。
代碼如下:
void FindContinousSequence(int sum) {if (sum < 3) return;int small = 1;int big = 2;int middle = (1 + sum) / 2;int curSum = small + big;while (small < middle){if (curSum == sum) PrintContinousSequence(small, big);while (curSum > sum && small < middle){curSum -= small;small++;if (curSum == sum) PrintContinousSequence(small, big);}big++;curSum += big;} }void PrintContinousSequence(int small, int big) {for (int i = small; i <= big; i++) cout << i << " ";cout << endl; }這段代碼用到了一個(gè)小技巧:
通常我們可以用循環(huán)求一個(gè)連續(xù)序列的和,但考慮到每一次操作之后的序列和操作之前的序列相比大部分?jǐn)?shù)字都是一樣的,只是增加或者減少了一個(gè)數(shù)字,因此我們可以在前一個(gè)序列的和的基礎(chǔ)上求操作之后的序列的和。這樣可以減少很多不必要的運(yùn)算,從而提高代碼的效率。
測(cè)試用例:
● 功能測(cè)試(存在和為 s 的連續(xù)序列,如 9、100 等;不存在和為 s的連續(xù)序列,如4、0)。
● 邊界值測(cè)試(連續(xù)序列的最小和3)
本題考點(diǎn):
● 考查思考復(fù)雜問(wèn)題的思維能力。應(yīng)聘者如果能夠通過(guò)一兩個(gè)具體的例子找到規(guī)律,解決這個(gè)問(wèn)題就容易多了。
● 考查知識(shí)遷移的能力。應(yīng)聘者面對(duì)第二個(gè)問(wèn)題的時(shí)候,能不能把解決第一個(gè)問(wèn)題的思路應(yīng)用到新的題目上,是面試官考查知識(shí)遷移能力的重要指標(biāo)。
總結(jié)
以上是生活随笔為你收集整理的[剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iQOO 12 系列手机维修备件价格公布
- 下一篇: [剑指offer]面试题42:翻转单词顺