騰訊面試題 上排下排次數的兩種思路

2021-06-26 02:30:52 字數 1723 閱讀 6980

給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數,要求下排每個數都是先前上排那十個數在下排出現的次數。  

上排的十個數如下:  

【0,1,2,3,4,5,6,7,8,9】

舉乙個例子,  

數值:0,1,2,3,4,5,6,7,8,9  

分配: 6,2,1,0,0,0,1,0,0,0  

0在下排出現了6次,1在下排出現了2次,  

2在下排出現了1次,3在下排出現了0次....  

以此類推..   

有兩種思路

①程式設計解決

對下排陣列a進行n遍修正(次數n未知),直到求出符合要求的下排陣列b

修正過程為:對上排的每個元素a[i],從頭對下排進行遍歷,求出i在下排出現的次數k,令b[i]=k

值得注意的是,對b[i]的賦值可能會影響到下排陣列b中元素的正確性,我們這時不用擔心,將它們交給下次遍歷修正就好了

另外:這種方法的正確性可能受下排陣列b的初值的影響,但經過試驗,我並沒有發現有令演算法失敗的初始狀態。在此不試圖證明演算法的正確性與b的初始總是狀態無關,因為我們只需要知道b的一組確保演算法成功的初值就好了。這裡我們設定為intb[

n] = ;

②數學推理

由於問題所限定的範圍較小,我們完全可以從數學上進行推理,得到正確結果。

一條重要的結論是 b中所有元素的和為10 這是顯而易見的

我們從最大的數9開始推理,因為9的取值明顯要小於等於1。若取1,則b[1]=1 b[9]=1,相加的10,故b其餘元素應為0,導致b[0]>=1,相加》10,所以b[9]=0。相同的過程,我們可以得到b[9]=b[8]=b[7]=0。

若b[6]=1則b中等於6的元素必然是b[0],若是任何乙個b[j]=6,j>=1,會導致b中元素和大於10。

這時b[6]=1 b[0]=6 相加為7,則顯然b[4]=b[5]=0

若b[3]=1,則相加得10,剩下兩個元素必須取0,這樣又導致b[0]=7,和大於10了就,所以b[3]=0

再往下可以明顯看出b[2]=1 b[1]=2時符合要求。

推理過程雖然繁瑣,但難度不大,只要細心即可。

思路一:

#pragma once

#include#includeusing namespace std;

static bool flag = false;//是否滿足題目要求的標誌

const int n = 10;//陣列大小

//列印陣列

void print(int b)

//計算a[index]在b中出現的次數

int count(int a, int b, int index)

//檢查是否滿足題目要求

bool check(int a, int b)

} return result;

}void update(int a, int b)

flag = check(a, b); }}

void main()

;// int b[n] = ;

update(a, b);

cout << "a: ";

print(a);//作為對應,輸出b時一目了然

cout << "b: ";

print(b);

system("pause");

}

面試100題 6 求上排數字在下排出現的次數

題目 給你10分鐘時間,根據上排給出十個數,求在其下排填出對應的十個數,要求下排每個數都是先前上排那十個數在下排出現的次數。上排的十個數如下 0,1,2,3,4,5,6,7,8,9 初看此題,貌似很難,10分鐘過去了,可能有的人,題目都還沒看懂。舉乙個例子,數值 0,1,2,3,4,5,6,7,8,...

盤點那些有趣的IT面試題 上

1.寫乙個高效c語言程式,計算乙個無符號整數中1的個數。輸入 輸出 0 00 0 1 01 1 2 10 1 3 11 2 2.給定字串s1和s2,寫程式判斷s2是否能由s1旋轉而來,要求只能呼叫一次strstr系統函式。例如 s1 abcd and s2 cdab,return true 而 s1...

第39級台階以及騰訊面試題上50台階的可能數

小明剛剛看完電影 第39級台階 離開電影院的時候,他數了數禮堂前的台階數,恰好是39級 站在台階前,他突然又想著乙個問題 如果我每一步只能邁上1個或2個台階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。那麼,上完39級台階,有多少種不同的上法呢?請你利用計算機的優勢,幫助小明尋...