Java程序,用于打印字符串中只有一次可用的字符

Java程序,用于打印字符串中只有一次可用的字符,java,arrays,string,search,Java,Arrays,String,Search,我试图打印字符串中只出现一次的字符。这是我正在使用的代码,但它总是以H显示答案 我怎样才能解决这个问题 class StringRepeat { static int i,j; public static void main(String[] args) { String s1 = "How are How"; outer:for(i=0;i<=s1.length(); i++) { inner:f

我试图打印字符串中只出现一次的字符。这是我正在使用的代码,但它总是以H显示答案

我怎样才能解决这个问题

class StringRepeat {

    static int i,j;

    public static void main(String[] args) {
        String s1 = "How are How";
        outer:for(i=0;i<=s1.length(); i++)
        {
            inner:for(j=1;j<s1.length(); j++)
            {
              if (s1.charAt(i) != s1.charAt(j))
                break outer;
            }
        }
        System.out.println(s1.charAt(i));
    }
}
类字符串重复{
静态int i,j;
公共静态void main(字符串[]args){
String s1=“How are How”;
外部:对于(i=0;i试试这个

String s = inputString.toLowerCase();

boolean[] characters = new boolean[26];
for(int i = 0; i < 26; i++)
    characters[i] = true;

for(int i = 0; i < s.length(); i++)
{
    if(characters[s.charAt(i) - 'a'])
    {
        System.out.println(s.charAt(i));
        characters[s.charAt(i) - 'a'] = false;
    }
}
String s=inputString.toLowerCase();
布尔[]字符=新布尔[26];
对于(int i=0;i<26;i++)
字符[i]=真;
对于(int i=0;i
希望这能有所帮助。我假设你对待小写和大写的方式与你可以相应修改的方式相同

  • 如果没有唯一性,这将给出一个
    StringIndexOutOfBoundsException
    可以找到以下字符:

    outer:for(i=0;i<=s1.length(); i++)
    

  • 如果内部for循环终止,即到达 字符串,则
    i
    处的字符是唯一的,因此我们需要将 外环的一部分

  • 退出外部循环时,您需要确定是否找到了唯一的元素,如果
    i
    ,则会出现这种情况
  • 综上所述,我们得到:

    String s1= "How are How";
    int i = 0;
    outer: for(;i<s1.length(); i++)
    {
        for(int j=0;j<s1.length(); j++)
        {
          if (i!=j && s1.charAt(i) == s1.charAt(j))
           continue outer;
        }
        break;
    }
    if(i<s1.length()) System.out.println(s1.charAt(i));
    
    String s1=“你好吗”;
    int i=0;
    
    外部:对于(;i来说,基本上你可以用两种方法解决这个问题-蛮力(使用数组)和更智能的一点(使用贴图)

    蛮力方式 对于输入字符串中的每个字符,检查其是否与其他字符相同:

    public void uniqueCharsBruteForce(String input) {
        for (int i = 0; i < input.length(); ++i) {
            char candidate = input.charAt(i);
            if (!contains(input, candidate, i)) {
                System.out.println(candidate);
            }
        }
    }
    
    private boolean contains(String input, char candidate, int skipIndex) {
        for (int i = 0; i < input.length(); ++i) {
            if (i == skipIndex) {
                continue;
            }
            if (candidate == input.charAt(i)) {
                return true;
            }
        }
        return false;
    }
    

    这可以进一步优化,但这可能足以满足您的要求。时间复杂度为
    O(n)

    这将打印出文本中只出现一次的每个字符

    final String s1 = "How are How";
    outer:for(int i = 0; i < s1.length(); i++)
    {
        for(int j = 0; j < s1.length(); j++)
        {
            if(s1.charAt(i) == s1.charAt(j) && i != j)
            {
                continue outer;
            }
        }
        System.out.println(s1.charAt(i);
    }
    
    final String s1=“How are How”;
    外部:用于(int i=0;i
    这甚至不能解决问题。你能修改我的代码吗?@javaguy IvanMilosavljević你能详细解释一下为什么它不起作用吗?这是解决此类问题的最佳策略,保持时间复杂性mind@AviralAhuja虽然代码可以工作,但它不能解决给定的问题一次,它不应该打印。无论字符在字符串中出现的次数如何,您的代码都会打印字符一次。@AviralAhuja我将尝试用伪代码重新表述。OP需要一个执行此操作的代码:
    if(characterappearsonlynce)打印字符
    。但是你的代码会这样做,
    将每个字符打印一次
    。它不会显示任何输出…没有编译时错误。程序在运行后执行后终止。实际上,当我运行它时,它会打印一个
    。我在IDEOne上添加了一个代码链接,这样你就可以在那里运行它了。非常感谢……我的问题已经解决了ed now.你能告诉我外部for循环是如何工作的吗?我从来没有见过这种for循环。@SirRaffleBuffle我想问题不在于它没有打印出
    a
    ,也就是说,它只打印出
    a
    ,而不是只出现一次的其他字符。你有几个答案,应该有几个答案回答您的问题。请标记您选择的解决方案。
    if (s1.charAt(i) != s1.charAt(j))
      break outer;
    
    if (i!=j && s1.charAt(i) == s1.charAt(j))
      continue outer;
    
    String s1= "How are How";
    int i = 0;
    outer: for(;i<s1.length(); i++)
    {
        for(int j=0;j<s1.length(); j++)
        {
          if (i!=j && s1.charAt(i) == s1.charAt(j))
           continue outer;
        }
        break;
    }
    if(i<s1.length()) System.out.println(s1.charAt(i));
    
    public void uniqueCharsBruteForce(String input) {
        for (int i = 0; i < input.length(); ++i) {
            char candidate = input.charAt(i);
            if (!contains(input, candidate, i)) {
                System.out.println(candidate);
            }
        }
    }
    
    private boolean contains(String input, char candidate, int skipIndex) {
        for (int i = 0; i < input.length(); ++i) {
            if (i == skipIndex) {
                continue;
            }
            if (candidate == input.charAt(i)) {
                return true;
            }
        }
        return false;
    }
    
    public void uniqueCharsBetter(String input) {
        Map<Character, Integer> occurences = new HashMap<>();
        for (int i = 0; i < input.length(); ++i) {
            Character key = Character.valueOf(input.charAt(i));
            occurences.put(key, occurences.getOrDefault(key, 0) + 1);
        }
        occurences.entrySet().forEach(entry -> {
            if (entry.getValue().intValue() == 1) {
                System.out.println(entry.getKey());
            }
        });
    }
    
    final String s1 = "How are How";
    outer:for(int i = 0; i < s1.length(); i++)
    {
        for(int j = 0; j < s1.length(); j++)
        {
            if(s1.charAt(i) == s1.charAt(j) && i != j)
            {
                continue outer;
            }
        }
        System.out.println(s1.charAt(i);
    }