程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 微軟等數據結構與算法面試100題 第六題

微軟等數據結構與算法面試100題 第六題

編輯:C++入門知識

第六題
題目:
給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數
要求下排每個數都是先前上排那十個數在下排出現的次數。
上排的十個數如下:
【0,1,2,3,4,5,6,7,8,9】

分析:這道題拿到題目第一感覺是使用迭代算法計算,終止條件是求解得到上面的解。
如果使用迭代算法,會造成一下兩個問題:1,迭代算法不能夠保證收斂,因此可能陷入死循環,或者說是收斂不到解。2,迭代算法不能夠求解全部的解,只能得到滿足該
條件的一個解。

使用迭代算法的代碼如下:
[cpp] 
#include<iostream> 
#include<stdio.h> 
using namespace std; 
 
bool timeNoOf(int * timeNoOf, int * Array, const int length) 

    bool success = true; 
    for(int i = 0; i < length; i++) timeNoOf[i] = 0; 
    for(int i = 0; i < length; i++) 
    { 
        timeNoOf[Array[i]] = timeNoOf[Array[i]] + 1; 
    } 
    for(int i = 0; i < length; i++) 
    { 
        if(timeNoOf[i]!=Array[i]) 
        { 
            success = false; 
            Array[i] = timeNoOf[i]; 
        } 
 
    } 
    //int sum=0; 
    //for(int i=0; i<length-1; i++) sum = sum + Array[i]; 
    //Array[length-1] = length - sum; 
    return success; 

 
 
 
void timesNoArray(int *a, int * timeNo, const int length) 

     
    for(int i=0; i < length; i++) timeNo[i] = 0; 
    bool success = false; 
    while(!success){ 
        //update the timeNo array 
        success = timeNoOf(timeNo, a, length); 
        for(int i =0; i < 10; i++ ) cout<< timeNo[i]<<" "; 
        cout<<endl; 
    } 
     

 
 
int main() 

    int a[] = {0,1,2,3,4,5,6,7,8,9}; 
 
    int b[] = {0,1,2,3,4,5,6,7,8,9}; 
 
    timesNoArray(a,b,10); 
 
    for(int i =0; i < 10; i++ ) cout<< b[i]<<" "; 
 
    return 0; 

 

在測試例子的時候,發現當n=10,即十個數如 0  1 2 3 4 5 6 7 8 9時候會在兩個解之間擺動,但是收斂不到需要求解的解。
其它更好的求解算法待後續補充!也請各位大牛指正!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved