- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我当时正在做一个编程练习,一直想找出正确的算法。这是问题所在:
Given a decimal number, how many minimum possible steps are required to convert this to zero provided:
- Change the bit i if the next bit i+1 is '1' and all the other bits i+2 and later are 0
- Change the last bit without restriction
例如:
如果输入是 (8)Base10 = (1000)Base2,那么采取的步骤是:
1000→1001→1011→1010→1110→1111→1101→1100→0100→0101→0111→0110→0010→0011→0001→0000
总共需要 15 个步骤。
完成以下定义:
int minStepsRequired(long number)
得到一个伪代码或算法就可以了。这不是家庭作业或作业。
最佳答案
对于递归算法来说,这是一个很好的问题。
如果二进制表示的长度为0,就已经可以说出答案了。或者,如果不允许长度为 0,那么如果长度为 1,则根据该一位是 0 还是 1 来告诉答案。
如果长度大于1:
该算法可能需要很长时间。它实际上是在计算步数,因此花费的时间与步数成正比,我认为这与输入数大致成正比。您的方法需要一个 long
参数,但是对于较大的 long
值,我的算法可能不会在其运行的计算机的生命周期内终止。此外,步数可能会溢出 int
甚至 long
(如果输入是负的 long
值)。
以下解决方案不需要递归并在恒定时间内运行。我无法正确解释它是如何工作的,如果我们想将它用于某些事情,这是一个严重的问题。我玩了一些例子,看到了一个模式并将其概括。相比之下,恕我直言,上述递归解决方案的一些优点在于它易于理解(如果您了解递归)。
示例:输入 8 或 1000
二进制。结果 15 或 1111
二进制。模式是:结果的每一位是结果的前一位与输入中相同位置的位的异或。因此,从 1000
开始,只需复制前面的位,1。后面的位是 1 XOR 0 = 1,其中 1 是结果的前面的位,0 从输入中取出。其余两位同理计算。
一个更长的例子,你可以检查你是否理解:
Input: 115 = 1110011
Result: 1011101 = 93
或者在代码中:
static BigInteger calculateStepsRequired(long number) {
// Take sign bit
int bit = number < 0 ? 1 : 0;
BigInteger result = BigInteger.valueOf(bit);
for (int i = 0; i < 63; i++) {
number = number << 1;
int sign = number < 0 ? 1 : 0;
bit = (bit + sign) % 2;
result = result.shiftLeft(1).add(BigInteger.valueOf(bit));
}
return result;
}
我已将此方法与我自己使用高达 100 000 000 的各种输入实现的上述第一个算法进行了对比,它们始终一致,因此我相信快速方法也是正确的。我仍然建议您编写代码、运行并测试它以验证我做对了。
关于java - 编程 : Minimum steps required to convert a binary number to zero,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54812971/
我是 Haskell 术语的初学者。我必须做一个显示所有最低位置的练习。 例如: [1,2,3,1,1] => 0,3,4 这些是最小位置。 我尝试用两种方法来做到这一点,但这些都不起作用。 请有人帮
我需要找到整个矩阵的最小值,它是“坐标”。在像 这样的矩阵中 matrix = 8 7 6 5 4 3 2 1 最小值为 (2, 4) 处的 1。 最佳答案 这可以很简单地通过使用
给定一个正整数“l”和“r”。找到最小的数字“n”,使得 l r: cnt = 32 for i in range(l, r+1): s = bi
numpy.minimum 似乎不适用于复数: np.minimum(5+3*1j,4+30*1j) (4+30j) 我想保持最大幅度的值。它只比较实部。元素最小比较的任何其他功能? MATLAB m
鉴于数据库中的以下事实: foo(a, 3). foo(b, 2). foo(c, 4). foo(d, 3). foo(e, 2). foo(f, 6). foo(g, 3). foo(h, 2).
假设我们给出了给定图 G 的最小生成树 T(有 n 个顶点和 m 个边)和一条权重为 w 的新边 e = (u, v),我们将添加到 G 中。 I) 检查 T 是否仍然是 MST。II) 如果不是,请
我有一个名为“posts”的elasticsearch索引。 http://127.0.0.1:9200/posts/doc/_count返回{"count":240000,"_shards":{"t
我在 MySQL 中有一个表,名称如下 我有两件事要处理 1- 停用所有未使用的书籍 isActive = 1 - Active isActive = 0 - Inactive is_inuse =
我的站点位于 www.ethoma.com/wd/ . 如您所见,我已经使用自己的代码实现了主题和所有菜单。我想在我的网站上安装 WordPress,这样我就可以简单地在 WordPress 上输入我
当我在 bool 数组上使用 numpy 函数 minimum() 和 maximum() 时,结果类型打印为 numpy.int32。但是,与 numpy.int32 类型的比较失败(即使在转换之后
我在分布式系统中遇到分片移动问题。 【问题】 最初每个分区负责任意数量的分片。 (这个数字可以是任意的,因为系统支持将分片从一个分区移动到另一个分区) 然后一个新的分区来了,系统需要重新分片。目标是使
我有 3 个这样的观点: 我需要定义一个约束,以便在蓝色或芥末色垂直调整大小时,红色 View 将保持在任一上 View 的最小距离处,例如 或者 那么我怎样才能达到那个结果呢??? 最佳答案 建立从
题目地址:https://leetcode.com/problems/minimum-area-rectangle/description/ 题目描述 Given a set of points
题目地址:https://leetcode-cn.com/problems/path-with-minimum-effort/ 题目描述 你准备参加一场远足活动。给你一个二维 rows x col
题目地址:https://leetcode.com/problems/minimum-absolute-difference/ 题目描述 Given an array of distinct in
题目地址:https://leetcode.com/problems/minimum-height-trees/description/ 题目描述 Fora undirected graph wi
题目地址:https://leetcode.com/problems/minimum-time-difference/description/ 题目描述: Given a list of 24-h
题目地址: https://leetcode.com/problems/minimum-genetic-mutation/description/ 题目描述 Agene string can be
你们能帮我解决一些我被困的家庭作业问题吗? 完整二叉树中的局部最小值被定义为小于其所有邻居(邻居 = 父、左子、右子)的节点。 我需要在给定的完整二叉树中找到一个局部最小值,它的每个节点都有不同的数字
(defun *smaller* (x y) ( if (> x y) y x)) (defun *minimum* (lst) (do ((numbers lst (cdr
我是一名优秀的程序员,十分优秀!