有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

数组Java程序以打印字符串中只有一次可用的字符

我试图打印字符串中只出现一次的字符。这是我正在使用的代码,但它总是以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));
    }
}

共 (4) 个答案

  1. # 1 楼答案

    试试这个

    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;
        }
    }
    

    希望这有帮助。我假设你对待小写和大写的态度和其他你可以相应修改的一样

  2. # 2 楼答案

    基本上,你可以用两种方法解决这个问题——蛮力(使用数组)和更智能一点(使用地图)

    蛮力方式

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

    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^2)

    使用地图

    在迭代输入时,计算每个字符出现的次数。最后,只打印出现一次的内容:

    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());
            }
        });
    }
    

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

  3. # 3 楼答案

    1. 如果没有唯一性,这将给出一个StringIndexOutOfBoundsException 可以找到char:

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

      换成

      int i = 0;
      outer: for(;i<s1.length(); i++)
      
    2. 不需要内部标签,您需要开始搜索 从0开始,而不是1,所以替换

      inner:for(j=1;j<s1.length(); j++)
      

      for(int j=0;j<s1.length(); j++)
      
    3. 你的考试被颠倒了。如果ij处的字符是 同样,你需要继续与外部循环。而且,你需要 确保在^{时不进行比较。因此,您的测试更改为:

      if (s1.charAt(i) != s1.charAt(j))
        break outer;
      

      if (i!=j && s1.charAt(i) == s1.charAt(j))
        continue outer;
      
    4. 如果内部for循环终止,即到达 字符串,那么i处的字符是唯一的,所以我们需要进行拆分 外环的一部分

    5. 当您退出外部循环时,您需要确定是否找到了唯一的元素,如果i < s1.length(),就会出现这种情况

    综上所述,我们得到:

    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));
    

    这里是代码(IDEOne)的链接

  4. # 4 楼答案

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

    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);
    }