一个有趣的编号问题的C语言实现
2011-11-06 19:01
531 查看
题目来自网友分享:腾讯算法面试题
算法与代码
题目如下:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数。要求下排每个数都是先前上排对应那个数在下排十个数中出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
题目是比较简单的,我用C语言实现如下(引文中有java实现),其中输出中间过程的结果,最后输出总次数:
这里我把10设作常量N,N是可以改变的,只要N大于3。若N为1、2,无意义,若N为3,效果等于N=4,但不能直接将程序中N设作3,不然会有死循环。
多试几个N值,就会发现一个通用的规律,即:
0位对应N-4,1位对应2,2位对应1,N-4位对应1,其他位对应0。
引文中提到“这个算法可以用到数据压缩领域”,我暂时没有想清楚这是如何实现,不知大家没有想法?
转载自iShens|Tech 作者:Shens Lu
我还不是很理解这个算法的思想。我是这样理解的:我们最终是要检验每一位在下排里面出现的次数就是对应位上的数字,于是我们从一开始遍历数组,先不管后面将要填什么数字,先确定前面要填的数字,即程序里面count每加1,我们就从前往后地确定了所要填的数字。这样循环遍历下去直到满足我们的要求。
但我想不明白为什么它总是会有结果,也就是为什么它不会是一个无限循环的过程。也不知道大家有什么想法?
算法与代码
题目如下:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数。要求下排每个数都是先前上排对应那个数在下排十个数中出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
题目是比较简单的,我用C语言实现如下(引文中有java实现),其中输出中间过程的结果,最后输出总次数:
#include <stdio.h> #define N 10 int temp ; void printTag(int tag){ printf("-----Tag %d------\n", tag); int i; for(i=0; i<N; i++) printf("%d ", temp[i]); printf("\n"); } int getNew(int index){ int n = 0; int i; for(i=0; i<N; i++) if(temp[i] == index) n++; return n; } int main(int argc, char** argv) { int chs, i, newN, count = 0; for(i=0; i<N; i++) temp[i] = i; printTag(0); while(++count) { chs = 0; for(i=0; i<N; i++){ newN = getNew(i); if(newN != temp[i]) chs = 1; temp[i] = newN; } if(chs==0){ printf("\nIt takes %d times.\n", count-1); return 0; } printTag(count); } }
这里我把10设作常量N,N是可以改变的,只要N大于3。若N为1、2,无意义,若N为3,效果等于N=4,但不能直接将程序中N设作3,不然会有死循环。
多试几个N值,就会发现一个通用的规律,即:
0位对应N-4,1位对应2,2位对应1,N-4位对应1,其他位对应0。
引文中提到“这个算法可以用到数据压缩领域”,我暂时没有想清楚这是如何实现,不知大家没有想法?
转载自iShens|Tech 作者:Shens Lu
我还不是很理解这个算法的思想。我是这样理解的:我们最终是要检验每一位在下排里面出现的次数就是对应位上的数字,于是我们从一开始遍历数组,先不管后面将要填什么数字,先确定前面要填的数字,即程序里面count每加1,我们就从前往后地确定了所要填的数字。这样循环遍历下去直到满足我们的要求。
但我想不明白为什么它总是会有结果,也就是为什么它不会是一个无限循环的过程。也不知道大家有什么想法?
相关文章推荐
- C语言用数组1. 简单约瑟夫环问题: N个人,编号从1~N围成一圈,输入一个数T,从1号开始报数,报到T的人出圈;下一人又从1开始报数,下一个报到T的人出圈,输出出圈顺序。 考虑问实现约瑟夫环问题
- java程序实现一个有趣的买啤酒问题
- 一个c语言构造函数调用的问题(有趣)
- 一个有趣的问题:怎么在JS的数组中去除重复元素?(JAVA实现吧..)
- 一个有趣的C语言问题
- 今天学习时突然联想到这样一个有趣但无用的问题:利用C语言(不能是其他语言)求两个整数的较大/小值-----要求不用if、三目?、switch、循环、数组、加减乘除求余、位运算符以及任何库函数
- 一个关于去除数组重复元素的问题(C语言实现)
- 一个关于去除数组重复元素的问题(C语言实现)
- C语言中关于指针,二维数组等的问题,一个有趣的发现
- 一个用C语言实现的数学问题
- 一个有趣的C语言问题:s = (++i) + (++i) + (++i)
- 赛码网,将功赎过问题,用C语言自己实现的一个程序,仅供参考
- 赛码网,股神问题,用C语言自己实现的一个程序,仅供参考
- 一个日历问题的C语言,C++(boost),python,Javascript,Java和Matlab的实现
- 使用c语言实现一个简单的易语言
- 《编程之美》买书问题及c语言代码实现
- 实现一个基于c语言的sin查找表,查找范围为[0 - 2*pi]
- Orange's 一个操作系统的实现--Bochs遇到的问题
- 实现datagrid的foot中增加一个新增数据行,以解决datagrid不能新增数据的问题
- Js屏蔽按住键盘一直输入的问题,实现按住也只能输入一个字符