面試題41 和為S的兩個數字和為S的連續整數序列

2021-07-23 04:51:07 字數 2501 閱讀 2656

1.題目:輸入乙個遞增排序的陣列和數字s,在陣列中找到兩個數字使他們的和為s,如果存在多對數字的和為s,則輸出其中的一對即可。

分析:例如對於陣列,以及要找的和為s,我們可以設定兩個指標,第乙個指標指向的是陣列的起始位置的值1,第二個指標指向的是末尾的數字15,計算兩個指標指向的數字的和,為16,判斷與s的大小關係,如果等於s,則剛好找到,如果比s小,則前面的指標向前移動乙個位置,如果比s大,則後面的指標往前移動乙個位置。因為是遞增的序列,最後乙個指標的額位置已經不能繼續往後移動,前面的指標往後移動的結果就是增大兩個數的和,後面的指標往前移動是縮小兩個數的和。當前判斷是比s大,則後面的指標往前移動,指向11,重新計算兩個指標指向的數的和為12,小於15,則此時前面的額指標往前移動指向2,重新計算兩個數的和為13,小於15,前面的指標繼續向前移動,此時指向4,計算兩個數的和為15,剛好等於15,則4和11即是我們要找的符合條件的兩個數。

連續數字的情況

2.題目,輸入乙個正數s,列印出所有和為s的連續整數序列(至少還有兩個數).例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以結果列印出三個連續的序列1-5,4-6,7-8.

分析:可以採用上面的類似的解法,用small和big分別指向起始較小的數和最後結束最大的數。計算small到big的之間的數的和,如果和比s大,則應該丟棄當前較小的small值,如果比s小,則應該增加big的值,如果等於s,那最好。

例如分析和為9的連續整數序列,small和big的初始值分別為1和2,則初始的和為3,比9小,增大big為3,和為6小於9,繼續增大big,何為10大於9,則此時丟掉small,small為2,此時和剛好為9,列印出small和big之間的數2,3,4.繼續增大big,發現2-5之間的和為14,大於9,丟掉此時的small,3-5之間的值為12,比9大,繼續丟點此時的small,4-5的和為9,滿足條件,列印4,5.此時由於small的值已到達9的一半左右,後續再無可能有滿足條件的數字。結束

原始碼:

/**

* 功能說明:找到和為s的數字

* 日期:2016-9-25

**/#includeusing namespace std;

bool findtwonumberofs(int *a, int length, int s, int* number1, int* number2)

else if (sum>s)//比s大,後面的指標向前移動

else//比s小,前面的指標向後移動

}return found;

}//列印連續序列

void printcontinuoussequence(int small, int big)

void findcontinuoussequence(int sum)

big++;

cursum += big; }}

int main()

; int num1, num2;

bool result = findtwonumberofs(data, sizeof(data) / sizeof(int), 15, &num1, &num2);

cout << "------------------------------" << endl;

cout << "1.和為15的兩個數字:" << endl;

if (result == true)

cout << "number1: " << num1 << " number2: " << num2 << endl;

else

cout << "none" << endl;

cout << "------------------------------" << endl;

cout << "2.和為15的連續正數序列:" << endl;

findcontinuoussequence(15);

system("pause");

return 0;

}

連續數字的情況

2.題目,輸入乙個正數s,列印出所有和為s的連續整數序列(至少還有兩個數).例如輸入15,由於1+2+3+4+5=4+5+6=7+8=15,所以結果列印出三個連續的序列1-5,4-6,7-8.

分析:可以採用上面的類似的解法,用small和big分別指向起始較小的數和最後結束最大的數。計算small到big的之間的數的和,如果和比s大,則應該丟棄當前較小的small值,如果比s小,則應該增加big的值,如果等於s,那最好。

例如分析和為9的連續整數序列,small和big的初始值分別為1和2,則初始的和為3,比9小,增大big為3,和為6小於9,繼續增大big,何為10大於9,則此時丟掉small,small為2,此時和剛好為9,列印出small和big之間的數2,3,4.繼續增大big,發現2-5之間的和為14,大於9,丟掉此時的small,3-5之間的值為12,比9大,繼續丟點此時的small,4-5的和為9,滿足條件,列印4,5.此時由於small的值已到達9的一半左右,後續再無可能有滿足條件的數字。結束

面試題41 和為s的兩個數字,和為s的連續正數序列

題目一 輸入乙個遞增排序的陣列和數字,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,輸出任意一對即可。例如輸入陣列和數字15,由於4 11 15,因此輸出4和11。思路 可以利用2個指標,分別指向陣列的第乙個元素和最後的乙個元素,如果兩元素之和大於我們輸入的和,則將第二個指標向...

面試題57 和為S的兩個數字

題意 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。思路 假設有兩個指標l,r分別在陣列的中,並且num l num r sum 因為這個陣列是有序的,很明顯我們可以知道 對於這個num l 所有的num r num ...

面試題57 和為s的數字(一)和為S的兩個數字

題目描述 輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得他們的和正好是s,如果有多對數字的和等於s,輸出兩個數的乘積最小的。開始時糾結乘積最小,後來轉念一想,a b sum,a和b越遠乘積越小,而一頭一尾兩個指標往內靠近的方法找到的就是乘積最小的情況。如果是乘積最大的情況就是一直找到兩...