传是腾讯的一道面试题,出的很有意思。题目如下:
给你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次….
以此类推..
此题目妙在乍一看很简单,但是在实现过程中,发现结果需要动态规划,重新检查计算,直到所有值都是正确的,答案是在处理结果中动态获得。
解题思路:
1、计算各个数据出现次数,用一个数组存储。
2、检测数据数组是否正确。
3、如果有位置不正确就重新计算。
4、如果都正确就输出结果。
代码如下:
package com.applee.exam1;
public class program2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int inputs[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int size = inputs.length;
int outputs[] = new int [size];
while(true){
boolean bBreak = true;
for(int i = 0; i < inputs.length; i++){
int times = 0;
for(int n = 0; n < outputs.length; n++){
if(inputs[i] == outputs[n])
times++;
}
if(outputs[i] != times){ //invalidate
int count = 0;
for(int n = 0; n < outputs.length; n++){ //count
if(inputs[i] == outputs[n])
count++;
}
outputs[i] = count;
bBreak = false;
}
}
if(bBreak)
break;
}
StringBuilder sInput = new StringBuilder();
sInput.append("数值:");
sInput.append(inputs[0]);
for(int i = 1; i < size; i++){
sInput.append(",");
sInput.append(inputs[i]);
}
System.out.println(sInput.toString());
StringBuilder sOutput = new StringBuilder();
sOutput.append("分配:");
sOutput.append(outputs[0]);
for(int i = 1; i < size; i++){
sOutput.append(",");
sOutput.append(outputs[i]);
}
System.out.println(sOutput.toString());
}
}
输出结果: