书中的方法很好,但是个人认为判断条件过多从而不容易掌握。可以利用BFS+剪枝即可,容易理解。《编程之美读书笔记》中有关于此题的BFS解法,但是我认为他剪得不彻底,可以再多剪剪。
标准BFS搜索m*n,所有0,1组成的数可以构造出一颗二叉树从而进行BFS。每层的数字长度相同,每个节点的左右孩子为其末尾分别添加0,1。BFS可保证是从小到大进行测试。
由于是按层序遍历的,因此可以保证如果bitmap中某个余数的对应项被置为1,则表示对应该余数的最小n*m已经找到。今后只需对它扩展即可。因为假设该数为x,之后遍历到的与它同余的数位y,则x<y。由y扩展出来的子树和x扩展出来的子树相同,因此可以把y对应的子树剪枝
bitmap[i]==1表示mod n余i的最小数已经被找到并且已经放入队列中继续做其子树的扩展。
之后再遇到余i的数,其子树和已找到的的最小的数相同,所以不需要再进行扩展,因此可以舍弃不处理(即不入队)
复杂度:若最终结果为k位,每一层最多有n个节点(余数为0...n-1),
因此空间复杂度为n(队列中最多有n个不同余数的节点),时间复杂度为O(kn)
code:
struct slot
{
slot():val(0),remainder(0){}
slot( __int64 v, __int64 r ):val(v),remainder(r){}
__int64 val ; __int64 remainder ;
};
void OnlyHasOneAndZero2( __int64 n )
{
slot *Q = new slot[n+1] ;
char *bitmap = new char[n] ;
memset( bitmap, 0, sizeof(char)*n ) ;
slot a ;
__int64 rear, front, capacity ;
__int64 left, right ;
__int64 leftR, rightR ;
rear = 0 ; front = 1 ; capacity = n ;
if( n==1 ) //***注意当n为1时,1%1=0,此为特殊情况
Q[++rear] = slot(1,0) ;
else
Q[++rear] = slot(1,1) ;
while( true )
{
a = Q[front] ; //出栈做处理、判断
if( ++front == capacity )
front = 0 ;
if( a.remainder == 0 )
{
printf( "n*m=%I64d , m=%I64dn", a.val, a.val/n ) ;
delete []Q ;
delete []bitmap ;
return ;
}
left = a.val*10 ; leftR = a.remainder*10%n ;
right = a.val*10+1 ; rightR = (a.remainder*10+1)%n ;
//只要bitmap中某位i被置1,则意味着mod n余i的最小数已经被找到
//若其左孩子的余数未出现过,则将其bitmap位置1,并加入队列做下面的扩展
if( !bitmap[leftR] )
{
bitmap[leftR] = 1 ;
if( ++rear == capacity )
rear = 0 ;
Q[rear] = slot( left, leftR ) ;
}
if( !bitmap[rightR] )
{
bitmap[rightR] = 1 ;
if( ++rear == capacity )
rear = 0 ;
Q[rear] = slot( right, rightR ) ;
}
}
}
【原】编程之美“找符合条件的整数”的BFS解法
《编程之美》热门书评
-
迟来的书评和感想──给喜爱编程的朋友
181有用 3无用 Milo 2010-02-24
这本书我读了两遍,分別是两个印次。读第一遍是这书刚出版的时候买的第一版,读第二遍是因为最近认识了本书作者及编辑,我说以前看到本书的一些小错处,出版社就寄了第7次印刷本给我。在新年前花了一个星期把书尽量仔细地看了一遍,发现这印次仍有一些小问题及程序的bugs,已连同其他意见回馈给作者。 我其实不太喜欢...
-
我所了解的微软面试
81有用 0无用 蓬山远 2012-11-11
2014 05 22本文是一年半以前写的了。这一年半之间微软发生了很大的变化,我自己也发生了很大的变化,时过境迁,世殊事异。大家就看个乐子好了,不宜再当作经验去套用了。------------------------------------------------------------------...
-
数据结构和算法是程序的根本——为什么?!
49有用 0无用 bluedavy 2009-07-10
转自博客。应该是差不多两个月前收到了这本书,一直到最近才抽出时间来看了下,这本书的开篇的第一题现在基本已经成了经典中的经典了,相信很多人都因为这个控制CPU使用率的题从而买了这本书的,在我自己看过这本书后我同时相信买了这本书的人应该会觉得非常的值得,要写出合理实现需求、高性能以及大数据量的程序,数据...
-
一本未看完的书 一段未走完的旅途
21有用 3无用 Dear Al 2010-03-29
答应了Lisa写这篇书评 买这本书是大四的时候了 大学接近尾声 作为一名计算机软件方向的本科毕业生 我们学校竟未开过一门类似于算法导论之类的课程 哦 对了 是有一门类似的数据结构 它和Linux是我大学阶段最喜欢的专业课了 不过那些内容 唉 那时候很喜欢在CSDN上瞎晃 于是便迷恋上了高纳德 接受了...
-
享受用程序语言思维的乐趣
20有用 0无用 gaomiao 2009-07-17
闲暇时喜欢翻书,但也许是习惯了屏幕前飞快的阅读速度,如今看书已不像原先啃书那般细致。阅读时往往对引出道理的故事很感兴趣,而到了讲道理的细节,便一扫而过。然而最近在读的《编程之美》一书,却是无论如何也无法像读其他书籍那样浮光掠影般翻看,而是字斟句酌,生怕遗漏了半点细节。如果说在看《算法导论》这样的经典...

