【问题标题】:Eliminating repeated characters in a string消除字符串中的重复字符
【发布时间】:2020-05-23 04:55:41
【问题描述】:

您好,我正在尝试使这部分工作,以便当输入是诸如“aaabbbccdddeef”之类的字符串时,输出是“abcdef”。我知道那里有解决方案,但令我困扰的是这不起作用,我不明白为什么。如果有人能帮助我理解为什么这段代码不起作用,我将不胜感激。

    Scanner input = new Scanner(System.in);
    System.out.print("please enter the string of characters: " );
    String str = input.nextLine();
    char[] store = new char[str.length()]; 
    int count =0;

    for(int i=0; i<str.length();i++) {

        for (int j=0; j<str.length(); j++) {

                if(str.charAt(i)==store[j] ){
                    count+=1;//when character not stored keep count to offset store position
                    break;
                }else {store[i-count] = str.charAt(i); count = 0;}
            }
        }
    System.out.println(str);
    System.out.print(store);

【问题讨论】:

  • 谢谢@ScaryWombat,但你知道它到底有什么问题吗?因为这让我在过去的几个小时里发疯了 T_T
  • 是的,当不存储字符并且将 a 与 null 进行比较时,它是偏移索引的重置,我已经通过使用 '*' 初始化整个存储数组来测试它,但它仍然没有不行。
  • 如果您不想使用此处提供的答案,那么我建议您使用调试器并逐步执行代码

标签: java filter text-processing


【解决方案1】:

如果 StringBuilder 不存在,另一种方法是附加到它

    Scanner input = new Scanner(System.in);
    System.out.print("please enter the string of characters: " );
    String str = input.nextLine();
    StringBuilder store = new StringBuilder ();

    for(int i=0; i<str.length();i++) {
        if (!store.toString().contains(Character.toString(str.charAt(i)))) {
            store.append(str.charAt(i));
        }
    }
    System.out.println(str);
    System.out.print(store);

【讨论】:

    【解决方案2】:

    需要更改第二个for 循环内的逻辑。您必须在第二个 for 循环中迭代 store 而不是 str。检查我的解决方案:

        Scanner input = new Scanner(System.in);
        System.out.print("please enter the string of characters: ");
        String str = input.nextLine();
        char[] store = new char[str.length()];
        int count = 0;
        boolean charInStore = false;
        for (int i = 0; i < str.length(); i++) {
            charInStore = false;
            for (int j = 0; j < store.length; j++) {
                if (str.charAt(i) == store[j]) {
                    charInStore = true;
                    break;
                }
            }
            if (!charInStore) {
                store[count] = str.charAt(i);
                count++;
            }
        }
        System.out.println(str);
        System.out.println(new String(store).trim());
    

    【讨论】:

    • for (int j = 0; j &lt; store.length; j++) { store 和 str 的长度相同。但是是的 对于仅在未找到时才添加的想法。与我在字符串中使用 contains 而不是循环遍历数组的答案相同。
    • @ScaryWombat 你是对的。您的答案更加优化。
    • @Anuradha THANK YOU 兄弟,非常感谢!你看到了我想要做什么。我现在注意到我在错误的时间存储,而在循环内,因为我需要使用 if 语句的 else。使用该标志来跟踪 if 语句的状态就可以了。同样使用计数作为索引而不是索引的偏移量更有效,再次感谢!现在我可以睡觉了!
    【解决方案3】:

    您确实需要利用桌面检查来更好地了解您的代码在做什么......

    +------+------+--------+--------------------+-------+
    |  i   |  j   |  str   |       store        | count |
    +------+------+--------+--------------------+-------+
    |    0 |    0 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
    |    0 |    1 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
    |    0 |    2 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
    |    0 |    3 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
    |    0 |    4 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
    |    0 |    5 | aaabbb | [a,  ,  ,  ,  ,  ] |     0 |
    |    1 |    0 | aaabbb | [a,  ,  ,  ,  ,  ] |     1 |
    | --- break                                         |
    |    2 |    0 | aaabbb | [a,  ,  ,  ,  ,  ] |     2 |
    | --- break                                         |
    |    3 |    0 | aaabbb | [a, b,  ,  ,  ,  ] |     0 |
    |    3 |    1 | aaabbb | [a, b,  ,  ,  ,  ] |     1 |
    | --- break                                         |
    |    4 |    0 | aaabbb | [a, b,  , b,  ,  ] |     0 |
    |    4 |    1 | aaabbb | [a, b,  , b,  ,  ] |     1 |
    | --- break                                         |
    |    5 |    0 | aaabbb | [a, b,  , b, b,  ] |     0 |
    |    5 |    1 | aaabbb | [a, b,  , b, b,  ] |     1 |
    | --- break                                         |
    +------+------+--------+--------------------+-------+
    

    核心问题是store[i - count] = str.charAt(i);。在您了解发生了什么之前,它可能并不明显。

    让我们仔细看看事情开始出错的地方......

    +------+------+--------+--------------------+-------+
    |  i   |  j   |  str   |       store        | count |
    +------+------+--------+--------------------+-------+
    | --- break                                         |
    |    3 |    0 | aaabbb | [a, b,  ,  ,  ,  ] |     0 |
    |    3 |    1 | aaabbb | [a, b,  ,  ,  ,  ] |     1 |
    | --- break                                         |
    |    4 |    0 | aaabbb | [a, b,  , b,  ,  ] |     0 |
    |    4 |    1 | aaabbb | [a, b,  , b,  ,  ] |     1 |
    | --- break                                         |
    +------+------+--------+--------------------+-------+
    

    好的,当 i = 4j0

    • str.charAt(i) = b
    • store[j] = a
    • count = 0

    所以,b != a,所以您使用 store[i - count],这相当于 store[4 - 0] 并在此时存储 str.charAt(i)(或 b

    事情从那里开始失控。

    “基本”问题是count 在循环之间没有相关性。我也会质疑是否需要两个循环

    【讨论】:

    • 多么疯狂的答案 ;-)
    • @ScaryWombat ?
    【解决方案4】:

    这可以是一个简单的解决方案,也可以是一个非常复杂的解决方案。

    我认为我的解决方案非常简单: 创建一个遍历整个字符串长度的 for 循环 然后使用 + charAt 的索引来确定一个字符串是否重复超过 1 创建名为 temp 的新字符串。 然后如果是这样,删除这些字符中的每一个,只留下一个 然后打印温度

    String.indexOf('a');
    

    【讨论】:

    • 不是反对者,但问题不在于“如何”解决问题,而是“为什么”发布的解决方案不起作用
    猜你喜欢
    • 2020-05-21
    • 2013-11-12
    • 1970-01-01
    • 2020-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多