题目:
根据上排给出十个数,在其下排填出对应的十个数,要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下: 【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与6个出现一次,其他都为0次。
说实话,粗一看到这样的题目,实在不知什么下手。但是一旦知道了答案,就简单至极。 原本我还想过用二元方法去解答,因为下排相加正好是也是10,或许上下排之间有一个不可告人之二元表达式……囧……如果这样想,你就错了。
可行的一种方法是,从左到右(或者从右到左),依次统计上排数在下排出现的次数,如果统计得出的次数与下排的数正好相等就不做处理;如果不相等,就将统计得到的次数赋予下排,并要求在此轮结束后再重新统计一次。直到每个统计数与对应的下排数相等,程序结束。 上图:
代码实现
使用java、javascript、c三种语法实现,虽然代码都差不多,但是不失为一个锻炼码功的机会,尤其本人司职Java程序员…… java版本:
package net.lianmi.arts;
import java.util.Arrays;
/**
* Created by Mark on 2014/9/1 0001.
*/
public class CountMap {
public int[] core(int[] srcList){
int[] rltList = new int[srcList.length];
boolean isNotOk = true;
while(isNotOk){
isNotOk = false;
int temp;
for (int i = 0; i < srcList.length; i++) {
temp = 0;
for (int j = 0; j < rltList.length; j++) {
if(srcList[i] == rltList[j]){
temp++;
}
}
if (temp != rltList[i]){
isNotOk = true;
rltList[i] = temp;
}
}
}
return rltList;
}
public static void main(String[] args) {
CountMap cm = new CountMap();
int[] ts = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
int[] rlt = cm.core(ts);
System.out.println(Arrays.toString(ts));
System.out.println(Arrays.toString(rlt));
}
}
JavaScript版本:
var core = function(srcList){
var isNotOk = true;
var reslutList = new Array(srcList.length);
while(isNotOk){
isNotOk = false;
for (var i = srcList.length - 1; i >= 0; i--) {
var temp = 0;
for (var j = reslutList.length - 1; j >= 0; j--) {
if(reslutList[j] == srcList[i]){
temp++;
}
};
if(reslutList[i] != temp){
isNotOk = true;
reslutList[i] = temp;
}
};
};
return reslutList;
}
var srcList = [0,1,2,3,4];
console.log(srcList);
console.log(core(srcList));
C语言版本:
#include
void core(int srcList[], int rltList[], int n){
int isNotOk = 1,i,j;
while(isNotOk){
isNotOk = 0;
for (i = 0; i < n; i++) {
int temp = 0;
for (j = 0; j < n; j++) {
if(srcList[i] == rltList[j])
temp++;
};
if(rltList[i] != temp){
isNotOk = 1;
rltList[i] = temp;
}
};
}
}
int main(){
int srcList[] = {0,1,2,3,4,5,6,7,8,9};
int rltList[10] = {0};
int n = 10,i;
core(srcList,rltList,n);
for (i = 0; i < n; i++) {
printf("%d ", srcList[i]);
};
printf("\n");
for (i = 0; i < n; i++) {
printf("%d ", rltList[i]);
};
return 0;
}