【问题标题】:How to remove duplicate letters with a loop ( either for or while ) loop如何使用循环(for或while)循环删除重复的字母
【发布时间】:2013-08-26 01:04:39
【问题描述】:

语言:Java 关键说明: *需要使用 For 循环或 While 循环遍历字符串 *它删除字符串的重复字母并返回没有重复的单词。

例如:字符串是 HELLO - 然后该方法循环并删除所有重复项,在本例中为“L”并最终返回 HELO

到目前为止我有这个

private String removeAnyDuplicates(String userWord)
{
   //Code goes here?
   return "" ; // Need to return the new string
}

【问题讨论】:

  • 始终将您尝试过的代码作为问题的一部分分享。
  • 欢迎来到 StackOverflow!在这里,我们希望问题得到代码、原始研究、示例和其他有关您所面临的特定问题的信息的支持。提问前请read and complete this checklist。尝试解决方案,当您遇到特定问题时再回来。
  • 输入“ABA”应该做什么?它应该返回“AB”还是“ABA”? “重复字母”一词似乎含糊不清;几个答案假设它只意味着相邻的重复。

标签: java


【解决方案1】:

您可以使用regular expressions 做到这一点。例如:

private static final Pattern REGEX_PATTERN = 
        Pattern.compile("(.)\\1*");

public static void main(String[] args) {
    String input = "HELLO, AABBCC";

    System.out.println(
        REGEX_PATTERN.matcher(input).replaceAll("$1")
    );  // prints "HELO, ABC"
}

【讨论】:

  • 这只会删除相邻的重复项。例如,它不会从“ABABAB”中删除重复项。
【解决方案2】:

我假设删除重复项意味着结果最多包含一次出现的任何字符。 (其他一些答案假设只需将相邻的重复项减少到单次出现。)基本算法是:

  • 将结果初始化为空字符串
  • 遍历输入的每个字符,如果该字符尚未出现在结果中,则将其附加到结果中
  • 返回结果

一个幼稚(而且非常低效)的实现是:

private String removeAnyDuplicates(String userWord)
{
    String result = "";
    for (int i = 0; i < userWord.length(); ++i) {
        char c = result.charAt(i);
        if (result.indexOf(c) < 0) {
            // negative index indicates not present
            result += String.valueOf(c);
        }
    }
    return result;
}

这有两个主要的低效率来源:它创建了许多中间 String 对象,并且它必须扫描迄今为止输入的每个字符的整个结果。这些问题可以通过使用其他一些内置 Java 类来解决——StringBuilder 可以更有效地累积结果,Set 实现可以有效地记录和测试哪些字符已经被看到:

private String removeAnyDuplicates(String userWord)
{
    int len = userWord.length();
    StringBuilder result = new StringBuilder(len);
    Set<Character> unique = new HashSet<Character>();
    for (int i = 0; i < len; ++i) {
        char c = result.charAt(i);
        // try to add c to set of unique characters
        if (unique.add(c)) {
            // if it succeeds, this is the first time seeing c
            result.append(c);
        }
    }
    return result.toString();
}

【讨论】:

    【解决方案3】:
    private String removeAnyDuplicates(String userWord)
    {
        CharSequence inputStr = userWord;
        int length = inputStr.length();
        Set<Character> uniqueChars = new HashSet<Character>();
    
        for(int i=0; i < length; ++i) {
            uniqueChars.add(inputStr.charAt(i));
        }
    
        return uniqueChars.size() >= 3;
    }
    

    看看这个answer

    【讨论】:

    • 这应该返回String 而不是boolean
    【解决方案4】:

    将字符串转换为 char 数组,并将其存储在 LinkedHashSet 中。这将保留您的订单,并删除重复项。

    像这样:

    private static String removeAnyDuplicates(String userWord)
        {
            char[] chars = userWord.toCharArray();
            Set<Character> charSet = new LinkedHashSet<Character>();
            for (char c : chars) {
                charSet.add(c);
            }
    
            StringBuilder sb = new StringBuilder();
            for (Character character : charSet) {
                sb.append(character);
            }
    
           return sb.toString();
        }
    

    记住:

    import java.util.LinkedHashSet;
    import java.util.Set;
    

    【讨论】:

      【解决方案5】:

      你可以试试这个

      public static void main(String args[]){
          System.out.println(removeAnyDuplicates("HELLO"));
      }
      
      private static String removeAnyDuplicates(String userWord)
      {
          char[] arr=userWord.toCharArray();
          List<String> list=new ArrayList<>();
          for(int i=0;i<arr.length;i++){
               if(!list.contains(String.valueOf(arr[i]))){
                   list.add(String.valueOf(arr[i]));
               }
          }
          return list.toString().replaceAll("\\[|\\]|\\,","") ;
      }
      

      【讨论】:

        【解决方案6】:

        试试这个班轮:

        private String removeAnyDuplicates(String userWord) {
            return userWord.replaceAll("(.)\\1+", "$1");
        }
        

        这使用正则表达式来查找重复的(2 个或更多)字母并将它们替换为该字母的单个实例。


        不清楚“重复”是指立即之后出现还是任何地方之后出现。对于任何地方,使用这个:

        private String removeAnyDuplicates(String userWord) {
            return userWord.replaceAll("(.)(?=.*\\1)", "");
        }
        

        【讨论】:

        • 这只会删除相邻的重复项。例如,它不会从“ABABAB”中删除重复项。
        • @ted 这不是他想要的吗?
        • @TedHopp 查看编辑,它有效,但删除了前面的重复而不是后面的重复,但仍然履行合同
        • 非常优雅。 (不过,对于刚学习 Java 的人来说,我不确定这是否是正确的答案。可能读起来像是某种神奇的咒语。)如果是学校作业,那么标准可能是“ABA”应该返回“AB”,而不是“巴”。但你说得对,它履行了规定的合同。
        猜你喜欢
        • 2021-07-27
        • 2014-03-23
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-21
        • 1970-01-01
        相关资源
        最近更新 更多