【编程题目】给你 10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数...
第 6 題(數組)
騰訊面試題:
給你 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 次,
12
2 在下排出現了 1 次,3 在下排出現了 0 次....
以此類推..
?
思路:
設上排的數字用 a[i]表示, 下排的數字用b[i]表示,每排有n個數字。則應滿足條件:
①?∑b[i] = n ? 下排所有數字的和為n
②∑a[i]*b[i] = n ?上下排對應的數字乘積相加的和為n
③ 下排出現了 b[i] 個 a[i]
④b[i] 一定小于 n
方法是暴力查找,從全0開始 嘗試所有的0-n的數字組合
在每次選擇一個數字后,先用∑a[i]*b[i] <= n 和?∑b[i] <= n 的條件去掉一大部分不符合條件的 相當于截枝 加快速度
然后對每次選定所有下排的數后,驗證是否滿足條件① 和 ③(滿足這兩個條件 其他的條件一定滿足) 滿足則返回。
/* 第 6 題(數組) 騰訊面試題: 給你 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 次, 12 2 在下排出現了 1 次,3 在下排出現了 0 次.... 以此類推.. start time = 14:44 end time = 17:25 */#include <iostream> using namespace std;//檢查,已有數字加起來的和是否超過n bool checkSum(int * b, int n) {int sum = 0;for (int j = 0; j < n; j++){sum += b[j];}return (sum == n) ; }//檢查組成是否滿足 “下排每個數都是先前上排那十個數在下排出現的次數。” bool checkcomponet(int * a, int * b, int n) {for (int i = 0; i < n; i++){int num = 0;for (int j = 0; j < n;j++){if (b[j] == a[i]){num++;}}if (num != b[i]){return false;}}return true; }/* 暴力計算 in:輸入 out:輸出數組 n:一共有多少個數字 num:當前要確定第幾個數字 */ bool findnum(int * in, int * out, int n, int num) {bool isFind = false;for (int i = 0; i < n; i++){out[num - 1] = i; //設當前數為i//根據和 與 積 不能大于n 去掉大部分錯誤的嘗試 int product = 0;int sum = 0;for (int j = num - 1; j < n; j++){product += out[j]*in[j];sum += out[j];}if (sum > n || product > n){break;}if (num == 1){if (checkcomponet(in, out, n) && checkSum(out, n)){isFind = true;}}else{isFind = findnum(in, out, n, num - 1); }if (isFind == true){break;}}return isFind; }int main() {int a[11] = {0,-1,1,2,-2,3,4,5,7,8,10};int b[11] = {0};bool isfind = findnum(a,b,11,11);cout << "a: ";for (int i = 0; i < 11; i++){cout << a[i]<< ' ';}cout<<endl;if (isfind == true){cout << "b: ";for (int i = 0; i < 11; i++){cout << b[i]<< ' ';}cout<<endl;}else{cout << "no answer can be find!" << endl;}return 0;}?
在網上找,還沒有看到什么十分好的方法。
我考慮過分解n,驗證分解結果是否滿足條件,但是沒有合適的思路。
轉載于:https://www.cnblogs.com/dplearning/p/3967311.html
總結
以上是生活随笔為你收集整理的【编程题目】给你 10 分钟时间,根据上排给出十个数,在其下排填出对应的十个数...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu时间显示不准确的解决方案
- 下一篇: Ubuntu下软件的安装、卸载方法