腾讯笔试题:根据上排的数填写下排的数,并满足要求。

c372662316 2011-08-24 09:26:57
根据上排给出十个数,在其下排填出对应的十个数, 要求下排每个数都是上排对应位置的数在下排出现的次数。上排的数: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

大家发下思路啊!
网上看别的帖子解答很费解
...全文
558 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
zeroasan_ 2011-08-27
  • 打赏
  • 举报
回复
我说一个深度遍历的算法(通用算法,前提:数字不相等,升序排列)
上排:x0, x1, x2, x3, ... , x8 , x9
下排: n0, n1, n2, n3, ... , n8 , n9

先给大家两个公式,由数据推导出来公式(将作为遍历中修剪分支的条件):
公式1 n0 + n1 + n2 + n3 + ... + n8 + n9 = 10
公式2 x0*n0 + x1*n1 + ... + n9*x9 = 10

两个公式是计算“下排数字个数”和“下排所有数字之和”推导的,这里不做详细说明了。

2. 通过从n9-n0进行选值,值从0开始,递增检测。
获取满足公式的下排数,然后做完全的对比验证。(不知道两个公式能不能反过来推导命题,所以保稳一点)




感觉有点像8皇后问题了,和所有的深度遍历的算法一样,最关键是怎么样裁减分支,两个公式是关键。

4楼给的分析效率更高,裁减分支更快,实现也肯定复杂一些。
shenyan008 2011-08-25
  • 打赏
  • 举报
回复
首先确定0出现n次,1+2+..+(10-n)<=10, n>=6
先从9开始尝试,如果1个9,必然有一个1,8个0,出现8了,否定
再从8开始,如果有1个8,有1个2,或者2个1,这两种情况都不符合,否定;
在从7开始,如果有1个7,必然是7个0,剩下两个数,必然是1个1和1个2,但不符合要求,否定;
在从6开始,如果一个6,情况较多,从0来思考,那么必然有6个0,尝试2个1和1个2,成功。
hnkdzuochao 2011-08-25
  • 打赏
  • 举报
回复
下排每个数都是上排对应位置的数在下排出现的次数,所以下排加起来等于10
5-9肯定1个出现1,其他都出现0
接下来就一个个试吧
zhangxfeng112 2011-08-25
  • 打赏
  • 举报
回复
这个编译通过,验证正确:

#include<stdio.h>

void main()
{
char row1[10] = {0,1,2,3,4,5,6,7,8,9};
char row2[10] = {0,0,0,0,0,0,0,0,0,0};
bool haveChanged = true;

while(haveChanged)
{
haveChanged = false;
for(char i = 0; i<10; i++)
{
int count = 0;

//caculate munber of "i" in row2.
for(char j = 0; j< 10; j++)
{
if(row2[j] == row1[i])
count++;
}

// mark and save change.
if(row2[i] != count)
{
haveChanged = true;
row2[i] = count;
}

}

}

printf("row2 is: \n")

for(char i = 0; i < 10; i++)
printf("%d, ",row2[i]);
printf("\n")


return;

}
zhangxfeng112 2011-08-25
  • 打赏
  • 举报
回复

void main()
{
char row1[10] = {0,1,2,3,4,5,6,7,8,9};
char row2[10] = {0,0,0,0,0,0,0,0,0,0};
bool haveChanged = true;

while(haveChanged)
{
haveChanged = false;
for(char i = 0; i<10; i++)
{
int count = 0;

//caculate munber of "i" in row2.
for(char j = 0; j< 10; j++)
{
if(i != j && row2[j] == row1[i])
count++;
}

// mark and save change.
if(row2[i] != count)
{
haveChanged = true;
row2[i] = count;
}

}

}

printf("row2 is: \n")

for(char i = 0; i < 10; i++)
print("%d, ",row2[i]);

return;

}

更正下
zhangxfeng112 2011-08-25
  • 打赏
  • 举报
回复
运行下:

void main()
{
char row1[10] = {0,1,2,3,4,5,6,7,8,9};
char row2[10] = {0,0,0,0,0,0,0,0,0,0};
bool haveChanged = true;

while(haveChanged)
{
haveChanged = false;
for(char i = 0; i<10; i++)
{
int count = 0;

//caculate munber of "i" in row2.
for(char j = 0; j< 10; j++)
{
if(i != j && row2[j] == row[i])
count++;
}

// mark and save change.
if(row2[i] != count)
{
haveChanged = true;
row2[i] = count;
}

}

}

printf("row2 is: \n")

for(char i = 0; i < 10; i++)
print("%d, ",row2[i]);

return;

}
c372662316 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhangxfeng112 的回复:]
这个编译通过,验证正确:

C/C++ code

#include<stdio.h>

void main()
{
char row1[10] = {0,1,2,3,4,5,6,7,8,9};
char row2[10] = {0,0,0,0,0,0,0,0,0,0};
bool haveChanged = true;

while(have……
[/Quote]
很强大啊,虽然不是用数学分析
keeya0416 2011-08-25
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 keeya0416 的回复:]
感觉4楼的
首先确定0出现n次,1+2+..+(10-n)<=10, n>=6
是有问题的
如果 0 为 n 次
那么对应的 n 下的数字是 1
那么 1 下面的数字 k 就满足 k>= 2
∵ n + 2*k <= 10
∴ n <= 6
且 n 为偶数 且 n!= 0
那么 n = 2, 4, 6
但当 k>2 的时候 后边必有3个数下对应 1 且这3个数均大于2
另 ……
[/Quote]
且 n 为偶数 且 n!= 0
那么 n = 2, 4, 6

貌似不太严谨,但不影响后边的分析
keeya0416 2011-08-25
  • 打赏
  • 举报
回复
感觉4楼的
首先确定0出现n次,1+2+..+(10-n)<=10, n>=6
是有问题的
如果 0 为 n 次
那么对应的 n 下的数字是 1
那么 1 下面的数字 k 就满足 k>= 2
∵ n + 2*k <= 10
∴ n <= 6
且 n 为偶数 且 n!= 0
那么 n = 2, 4, 6
但当 k>2 的时候 后边必有3个数下对应 1 且这3个数均大于2
另 分别为 n1, n2, n3 ...
可知 n1 + n2 + n3 + ... 必大于 10
所以 k = 2
n = 6
Cages 2011-08-25
  • 打赏
  • 举报
回复
4楼分析的很透彻
genio 2011-08-24
  • 打赏
  • 举报
回复
从大的开始分析
zhangxfeng112 2011-08-24
  • 打赏
  • 举报
回复
mark

33,027

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧