java 字符串字母迭代质询中的意外输出[已关闭]

rlcwz9us  于 2023-02-28  发布在  Java
关注(0)|答案(2)|浏览(147)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
2天前关闭。
Improve this question
目前我正在尝试解决以下问题:
等值线图是没有连续或不连续的重复字母的单词。实现一个函数来确定一个只包含字母的字符串是否是等值线图。假设空字符串是等值线图。忽略字母大小写。
示例:(输入--〉输出)
“皮纹”--〉真“阿坝”--〉假“mooOse”--〉假(忽略字母大小写)
isIsogram "Dermatoglyphics" = true isIsogram "moose" = false isIsogram "aba" = false
为了解决这个问题,我写了下面的代码。由于一个我看不到的原因,我的一个测试用例给了我一个true输出,而我期待的是false。我希望有人能看看我的代码,并指出正确的方向。感谢我所得到的任何知识!

public class isogram {
    public static boolean  isIsogram(String str) {
        for (int i = 0; i < str.length(); i++){
          for (int j = 0; j < str.length(); j++){
          char c = str.charAt(i);
          char d = str.charAt(j);
            if((c == d) && (i != j)){
              return false;
            
          }
        }
    } 
      return true;
}
  }

我尝试编写一个嵌套的for循环来导航单词。使用charAt从字符串中选择一个字母。在for循环下面使用if语句来比较字母。如果字母与要比较的字母相同,但位置不同,则返回false

5ktev3wc

5ktev3wc1#

因为你应该忽略字母的大小写,所以在比较它们之前对两个字母都调用Character.toLowerCase,或者,先对整个String调用toLowerCase,例如str = str.toLowerCase()

if (Character.toLowerCase(c) == Character.toLowerCase(d) && i != j)
    return false;

这也可以更简洁地写成流:

public static boolean isIsogram(String str) {
    return str.toLowerCase().chars().distinct().count() == str.length();
}
fivyi3re

fivyi3re2#

正如Unmitigate建议的那样,需要将字符串转换为全部小写(或大写),这样大小写不同的字母仍然算作同一个字母,但是,如果不想使用流,可以使用HashSet跟踪已经见过的字母,从而使算法更高效。
一个HashSet允许你检查一个项目是否在固定时间内存在于集合中,就像一个HashMap。通过添加每个字母到集合中,然后检查下一个字母是否已经存在于集合中,你只需要循环字符串一次,而不是两个嵌套的for循环。示例如下:

import java.util.HashSet;

public class isogram {
    public static boolean  isIsogram(String str) {
        // Convert string to lowercase
        str = str.toLowerCase();
        HashSet<Character> characters = new HashSet<Character>();
        
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);

            // If the letter is in the HashSet, it's a duplicate.
            if (characters.contains(c)) {
                return false;
            }
            
            // The letter wasn't in the HashSet. Add it and continue.
            characters.add(c);
        } 
      // We looped through the whole string and didn't find any duplicate chars - success!
      return true;
    }
    
    public static void main(String[] args) {
        System.out.println("Dermatoglyphics: " + isIsogram("Dermatoglyphics"));
        System.out.println("aba: " + isIsogram("aba"));
        System.out.println("MoOse: " + isIsogram("MoOse"));
        System.out.println("(empty string): " + isIsogram(""));
    }
}

相关问题