微软面试第一题 -先疯盗骨

本文介绍了一种基于特定规则生成数列的算法实现,通过迭代更新下排数列,使其每个元素代表上排数列中对应数值出现的次数。文章包含完整的Java实现代码,展示了如何从初始数列出发,逐步调整直至达到稳定状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你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 0 0 0 0 0 0 0 0 0
9 0 0 0 0 0 0 0 0 1
8 1 0 0 0 0 0 0 1 0
7 2 1 0 0 0 0 1 0 0
6 2 1 0 0 0 1 0 0 0
6 2 1 0 0 0 1 0 0 0
0 1 2 3 4 5 6 7 8 9
6 2 1 0 0 0 1 0 0 0

 

/**
* ...
*/
class BottomArrGenerate {
/**
* 按规则生成数组
* @param 数组长度
* @return 生成的数组
*/
public static int[] generateArr(int n) {
if (n < 4) {
System.out.println("请输入不小于4的整数");
return null;
}
int[] top = new int[n]; // 0-n一次排列的数字
int[] bottom = new int[n]; // 结果
for (int i = 0 ; i < top.length; i++)
top[i] = i;
for (int m = 0; m < n + 2; m++) {
boolean flag = true; // 找到结果标志
for (int i = 0; i < n; i++) { // 逐位对应
int count = getCount(i, bottom);
if (bottom[i] != count) { // 和上一次算出来的次数不符
bottom[i] = count;
flag = false;
}
}

if (flag) // 连续2次得到的次数一样,则为正确结果
break;
if (n + 1 == m && !flag) { // 算法有缺陷,n=5时是有结果2,1,2,0,0的,底下结果如果有2个数字等于上面的数字就算不出来
System.out.println("找不到结果");
return null;
}
}

return bottom;
}
/**
* 获得某数在数组中出现的次数
* @param 数
* @param 数组
* @return 数字在数组中出现次数
*/
public static int getCount(int num, int[] arr) {
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (num == arr[i]) {
count++;
}
}
return count;
}
}


public class Six {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int[] a = null;
try {
a = BottomArrGenerate.generateArr(scan.nextInt());
} catch (InputMismatchException e) {
System.out.println("请输入整数");
}

if (a != null) {
for (int i = 0; i < a.length; i++) {
System.out.print(i + "\t");
}
System.out.println();
for (int i : a) {
System.out.print(i + "\t");
}
}
}
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值