【问题标题】:Remove specific consecutive element in array [closed]删除数组中的特定连续元素[关闭]
【发布时间】:2013-06-13 02:07:16
【问题描述】:

我正在尝试将数组的连续元素减少到一个,但不是针对所有值,例如:

{3,0,0,0,3,3,3,0,0,0} => {3,0,3,0}

但对于特定的,在我的示例中为 0:

{3,0,0,0,3,3,3,0,0,0} => {3,0,3,3,3,0}

所以只有零(三个是完整的)被减少了。

我编写了 Java String 工作代码:

public static String removeConsecutive(String str, char remove) {
    char[] chars = str.toCharArray();

    int current = 0;
    int result  = current;
    while (current < chars.length) {
        if (chars[current] == remove) {
            // keep the first occurrence
            chars[result++] = chars[current++];

            // ignore the others
            while (current < chars.length && chars[current] == remove) {
                ++current;
            }
        } else {            
            chars[result++] = chars[current++];
        }
    }

    return new String(chars, 0, result);
}

它成功了:

public static void main(String[] args) {
    System.out.println(removeConsecutive("000300300030303330000", '0'));
}

输出:0303030303330

任何人都可以提出任何改进建议,因为它认为代码并不完美。

【问题讨论】:

  • 我认为这是codereview.stackexchange.com的一个好问题
  • @vidit,谢谢。我会将其发布在 codereview 上,并将链接粘贴到该讨论。
  • While 循环可能是无限循环。尽可能避免它们。在这种情况下,您可以将其替换为 foreach 语句。

标签: java arrays string algorithm


【解决方案1】:

认为这更清楚,并且可以完成工作:

public static String removeConsecutive(String str, char remove) {
    StringBuilder sb = new StringBuilder();
    for(char c : str.toCharArray()) {
        int length = sb.length();
        if(c != remove || length == 0 || sb.charAt(length - 1) != c) {
            sb.append(c);
        }
    }
    return sb.toString();
}

【讨论】:

【解决方案2】:

如果它不必就地:

public static String removeConsecutive(String str, char remove) {
   StringBuilder bldr = new StringBuilder();
   int rec = 0;
   for(char curr : str.toCharArray()){
     if(curr == remove){
       if(rec == 0) bldr.append(curr);
       ++rec;
     }
     else{
       rec = 0;
       bldr.append(curr);
     }
   }
   return bldr.toString();
}

【讨论】:

    【解决方案3】:
        int len = 0;
        do {
            len = str.length();
            str = str.replace(replacement + replacement, replacement);
        } while (len != str.length());
    

    【讨论】:

    • 效率极低。这是对str 的大量迭代。
    • 同意,但是任务的正确代码取决于上下文。如果系统在很长的字符串上运行数千个请求,这将不是一个有效的答案。然而,对于一个简单的演示或项目,简单易懂的代码是主要目标。无论如何,对于当前的硬件,您仍然在谈论微秒差异。
    • 嗨@shonky-linux-user,tnx 为您的回复,但我尝试不使用java replace / replaceAll。仅更改 char 时效率非常低,因为 replace / replaceAll 都会将其编译为 Pattern,匹配它,替换它。
    猜你喜欢
    • 2019-07-13
    • 2016-11-11
    • 2023-03-21
    • 2019-12-12
    • 2019-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多