【问题标题】:Specify a condition-based binary code in constant time在恒定时间内指定基于条件的二进制代码
【发布时间】:2018-06-02 21:22:43
【问题描述】:

问题表述:给定两个整数 t 和 l,指定一个长度为 l 的二进制代码,使得我们在恒定时间内每 (t-1) 位都有值为 1 的位。

例如,给定 t=3 和 l=10,结果为 1001001001。

我能想到的解决方案是对值为 1 的二进制代码进行一些移位:

A1=1 

A2=A1>>3

A3=A1>>(3x2)

result=A1||A2||A3

但是,这个解决方案效率不高。

我想要的是在恒定时间内解决这个问题。

【问题讨论】:

  • 我怀疑你能否在“恒定”时间内做到这一点。至少,它会是 O(l),不是吗?

标签: java binary


【解决方案1】:

也许你需要这样的东西:

public class SomeClass {
    public static void main(String args[]) {
        int l = 15;
        for(int t = 1; t < 10; ++t) {
            System.out.println(t + " " + l + " => " + toBinString(solve(t, l), l));
        }
    }
    public static String toBinString(int value, int length) {
        String s = "";
        for(int i = 0; i < length; ++i)
            s += (char)('0' + (value >> i & 1));
        return s;
    }
    public static int solve(int t, int l) {
        return ((1 << (l + t - 1)) - 1) / ((1 << t) - 1);
    }
}

输出:

1 15 => 111111111111111
2 15 => 101010101010101
3 15 => 001001001001001
4 15 => 001000100010001
5 15 => 000010000100001
6 15 => 001000001000001
7 15 => 100000010000001
8 15 => 000000100000001
9 15 => 000001000000001

【讨论】:

  • 我不完全理解您的解决方案,但我认为它不能在恒定时间内解决问题。
  • @EricHuang,你是认真的吗?看看函数“solve(int t, int l)”,没有循环。 “((1 &lt;&lt; (l + t - 1)) - 1) / ((1 &lt;&lt; t) - 1)”运行时间为 O(1)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2020-05-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多