作者ck574b027 (荒围!定厝!贼!妹!)
看板Python
标题Re: [问题]比大小求最小值
时间Wed Nov 6 03:31:19 2013
考虑到 M 一定不止一个,如果没有其他条件的话,
我想一个比较直观但会有很多 if 的解法,不是漂亮的数学解。步骤只有两个。
第一步:
把 L、U、N 以二进位表示并对齐,截出开头 U 比 L 长的那部分,叫做 head。
此时有两种情况:
U 比较长:会产生长度为 len(U) - len(L) 的区间。如
110001001001011110
1101100111000100010011 => 1101
^^^^
一样长:跳过起始一样的部分,截下再次遇到 L 的 1 之前的区间。如
1101100111000100010011
1101110001001001011110 => 10
^^
第二步:
将 N 位置相对应的区间拿出来 bit invert(0->1, 1->0),先叫 nx,此时有三种情况:
nx > head: nx &= head,变成以下其中之一。
nx = head: U 往下走,跳过 0,若 N 同位置也是 1 时,M 该位为 0,以下补 1。
若走完没遇到上述情况,M = U - 1
nx < head: 赞,後面全部补满 1 就是 M。
虽然转了 U、L,这就是我推文说的小於 U 找 M,不知道有没有 bug = =
如果没错的话复杂度 O(log(U))。
--
金木水火土
鍂林沝炎圭
鑫森淼焱垚
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.194.2.92
※ 编辑: ck574b027 来自: 123.194.2.92 (11/06 03:35)
1F:推 SansWord:如果这堆M之中又要求出最小的 M 呢? 11/06 16:04
2F:→ ck574b027:可以无脑补一的时候改成剩下的 N invert 11/06 18:16