如何解决查找 N 次迭代后得到的二进制字符串的第 k 个索引字符在每次迭代中 - “0”变为“10”,“1”变为“01”
我正在尝试为给定的场景确定一个解决方案(最好是在 JAVA 中):
输入:
- 二进制字符串:例如“1001”
- N - 迭代次数
- K - 字符串索引位置
每次迭代后,所有的1变成“01”,0变成“10” 例如
- 初始值/输入 --> "1001"
- 第一次迭代后 --> "01101001"
- 第二次迭代后 --> "1001011001101001"
- ...
- ...
- 在第 N 次迭代之后 --> "100101011......[Kth 索引值]......00101010111.."(这里我们的程序需要找到 第 K 个索引值,即 0 或 1)
输出: N 次迭代后第 k 个索引处的值(0 或 1)。
解决方法
N 次迭代后,每个原始数字变为 2N 数字,因此跳过数字直到我们接近 K。
例如对于输入 "1001"
,N=3
,K=20
,第 1 位数字变为 8 位数字,因此如果我们跳过这 8 位数字两次,即跳过 2 个原始数字 = 16 K,我们处于第 3 个原始数字 (a 0
),还有一个剩余的 K=4
。
然后我们对该数字进行迭代,得到 0
-> "10"
。我们现在可以重新开始操作,输入 "10"
、N=2
、K=4
。
重复直到完成。 O(N) 中的解决方案,无论输入长度或 K 值如何。
当然,您可以暴力破解它,但在更高的值下效果不佳,因为解决方案是O(L * 2N), L
是输入长度。
// Brute-force solution
static char solve(String input,int n,int k) {
String s = input;
for (int i = 0; i < n; i++)
s = s.chars().mapToObj(c -> c == '0' ? "10" : "01").collect(Collectors.joining());
return s.charAt(k); // assuming k is 0-based
}
上述解决方案的精简版:
// Optimized solution
static char solve(String input,int k) {
for (; n > 0; k %= 1 << n--)
input = input.charAt(k / (1 << n)) == '0' ? "10" : "01";
return input.charAt(k);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。