interview

根据上排给出的十个数,在其下排填出对应的十个数(腾讯面试题)

题目:
腾讯面试题:
给你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 次....
以此类推..

思路:这道题看了几分钟没看懂,晕。终于看懂了微笑
首先找下规律吧:

因为要求下面填入的是上面行的数对应在下面行出现的次数。那么,可以得出下面行的总和也就为上面行在下面行出现的总次数,并且很明显数就只有10个,那么总次数就为10。可以得出第二行数的综合为10.也可以看出,第一行的数对应第二行的数不为0,那么必定在第二行出现过,并且是出现过第二行次。举个例:比如下面的第一行的数字1在第二行的数为2,说明第二行就有两个1出现。所以,可以得出的结论是第一行的数乘以第二行对应的数等于总次数10.举个例:下面两行中2×1+1×2+6×1=10.

0

1

2

3

4

5

6

7

8

9

 

6

2

1

0

0

0

1

0

0

0

 

因此,可以得出两个线性方程组:

设10个变量:x1, x2, x3, x4, x5, x6, x7, x8,x9, x10

则,直接解一个线性方程组即可,可以直接求出通解。那么就是一个简单的线性代数求解问题了。

上面的方法可行,但是会消耗大量时间。

下面给出另一种思路:
 上面的10个数为top[10],下面设为bottom[10],top[i]=i,bottom[10]={0};
一开始将下面的10个数全部设置为0,不停迭代计算到最后不发生变化就可以了。
如:0  1 2 3 4 5 6 7 8 9
      0 0 0 0 0 0 0 0 0 0 0
接下来迭代: 
        
代码:

  1. #include <iostream.h>  
  2. #define len 10  
  3.   
  4. class NumberTB    
  5. {    
  6. private:  
  7.     int top[len];    
  8.     int bottom[len];  
  9.     bool success;  
  10. public:  
  11.     NumberTB();  
  12.     int* getBottom();  
  13.     void setNextBottom();  
  14.     int getFrequecy(int num);  
  15. };  
  16.   
  17. NumberTB::NumberTB()    
  18. {      
  19.     success = false;    
  20.     //format top     
  21.     for(int i=0;i<len;i++)    
  22.     {    
  23.         top[i] = i;            
  24.     }            
  25. }  
  26.   
  27.   
  28. int* NumberTB::getBottom()  
  29. {    
  30.     int i = 0;        
  31.     while(!success)    
  32.     {    
  33.         i++;    
  34.         setNextBottom();    
  35.     }            
  36.     return bottom;    
  37. }   
  38.   
  39. //set next bottom     
  40. void NumberTB::setNextBottom()    
  41. {    
  42.     bool reB = true;    
  43.      
  44.     for(int i=0;i<len;i++)    
  45.     {    
  46.         int frequecy = getFrequecy(i);    
  47.          
  48.         if(bottom[i] != frequecy)    
  49.         {    
  50.             bottom[i] = frequecy;    
  51.             reB = false;    
  52.         }    
  53.     }    
  54.     success = reB;    
  55. }   
  56.   
  57. //get frequency in bottom     
  58. int NumberTB::getFrequecy(int num)   //此处的num即指上排的数 i  
  59. {    
  60.     int count = 0;    
  61.     for(int i=0;i<len;i++)    
  62.     {    
  63.         if(bottom[i] == num)    
  64.             count++;    
  65.     }  
  66.     return count;    //cout即对应 frequecy  
  67. }  
  68.   
  69. int main()  
  70. {     
  71.     NumberTB nTB;  
  72.     int* result= nTB.getBottom();   
  73.   
  74.     for(int i=0;i<len;i++)   
  75.     {    
  76.         cout<<*result++<<endl;    
  77.     }    
  78.     return 0;  
  79. }        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值