【问题标题】:Compare two binary strings consist only 0 and 1 in java, want to findout which string is lexicographically greater比较两个二进制字符串在java中只包含0和1,想找出哪个字符串在字典上更大
【发布时间】:2018-10-15 15:08:29
【问题描述】:

这是我在比较二进制字符串时所做的,但在最坏的情况下需要 o(n) 时间。我已经尝试过手动和字符串 compareTo 方法,请帮助我用更好的方法来解决这个问题--

通过 CompareTo 方法 -

if (A.compareTo(temp) < 0) 
{
    System.out.println("YES");
}
else 
{ 
    System.out.println("NO"); 
}

通过迭代字符串:-

for (int k = 0; k < N; k++){
    if (A.charAt(k) == '1' && B.charAt(k) == '0') {
    System.out.println("NO");
    break;
} else if (B.charAt(k) == '1' && A.charAt(k) == '0') {
    System.out.println("YES");
    break;
}

看到这是完整的--

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int N = sc.nextInt();
    int Q = sc.nextInt();
    String A = sc.next();
    StringBuilder B = new StringBuilder(sc.next());
    for (long i = 0; i < Q; i++) {
        int pos = sc.nextInt();
        B.setCharAt(pos - 1, '1');
        String temp = B.toString();
        if (A.equals(temp)) {
            System.out.println("YES");
        } else {
            for (int k = 0; k < N; k++){
                if (A.charAt(k) == '1' && B.charAt(k) == '0') {
                System.out.println("NO");
                break;
            } else if (B.charAt(k) == '1' && A.charAt(k) == '0') {
                System.out.println("YES");
                break;
            }
        } /*
             * else if (A.compareTo(temp) < 0) { System.out.println("YES");
             * } else { System.out.println("NO"); }
             */
    }
}

【问题讨论】:

  • 你所说的“更好的方法”是什么意思?
  • 在最坏的情况下,最后一位会有所不同(或者不是,即字符串相等)你怎么知道在结束之前?那就是我怀疑是否存在比 O(n) 更好的东西。或者反问谁或什么让你认为有更好的解决方案?参考?
  • O(n) 是您在没有并行性的情况下可以做到的最好的。
  • 如果我必须做并行,我该如何实现它?
  • 好的,那么请编辑您的答案并在其中说明这一点。不要忘记为这些测试用例提供数据。

标签: java string binary binary-data


【解决方案1】:

您在每个 if 条件下进行两次比较。因为可以保证'0'&lt;'1' 这可以被简化。此外,如果要比较的两个字符不相等,您只需要做出详细的决定。

for (int k = 0; k < N; k++){
    if (A.charAt(k) != B.charAt(k))
    {
        System.out.println(A.charAt(k) < B.charAt(k)? "YES": "NO";
        break;
    }
}

【讨论】:

  • 如何提高时间复杂度?
  • 在每次迭代中,A.charAt(k)== B.charAt(k) 只有一个比较,而原始迭代有两个(如果两个字符都是 '0')或四个(两个字符都是 '1')。
  • 我明白了,但它并没有提高 O(n) 的时间复杂度,这似乎是 OP 想要解决的问题。
  • OP 正在寻找“更好的方法”。是的,它仍然是 O(n),但恕我直言,仍然提高了 3 倍。
  • 像 OP 提到的那样使用 compareTo 怎么样?您是否声称您的解决方案比使用 Java 的 compareTo 方法更好?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2018-04-23
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 2012-08-02
  • 2011-11-22
相关资源
最近更新 更多