【问题标题】:Why does "smallest" not return anything?为什么“最小”不返回任何东西?
【发布时间】:2018-05-19 03:24:44
【问题描述】:

您好,我目前正在处理 HackerRank 上的 Java 挑战,遇到了一个我无法用我的代码解决的问题。

提示如下,

给定一个字符串 s 和一个整数 k,完成函数,以便找到长度为 k 的字典上最小和最大的子字符串。

示例输入:
welcometojava
3

示例输出:
ava
wel

最小和最大子串仅基于第一个整数。因此,对于我的解决方案,我决定创建一个整数数组并使用 String s 中可用的每个字符的整数值填充它。

我想一旦我对数组进行排序,index[0] 将等于 minimum 的第一个字母,而 index[s.length()-1] 将等于 maximum 的第一个字母。从那里只需将数组中的每个后续字符连接到相应的最小/最大,只要最小/最大

使用上面的示例输入,我可以返回最大的“wel”。然而,最小的是返回一个空字符串,我不知道为什么。我实际上遵循了相同的方法来获取两个字符串的值,所以我认为最小的应该返回一个字符串值,无论所述值是否是正确的答案。

下面是我的源代码。

public static String getSmallestAndLargest(String s, int k) {
    String smallest = "";
    String largest = "";

    int[] temp = new int[s.length()];

    for (int i = 0; i < s.length(); i++) {
        temp[i] = (int) s.charAt(i);
    }

    Arrays.sort(temp);

    char[] charArray = s.toCharArray();

    // find smallest string
    for (int i = 0; i < charArray.length; i++) {

        if ((int) s.charAt(i) == temp[0]) {

            while (i < k) {
                smallest += String.valueOf(s.charAt(i));
                i++;
            }
        }
    }

    // find largest string
    for (int i = 0; i < charArray.length; i++) {

        if ((int) s.charAt(i) == temp[s.length()-1]) {

            while (i < k) {
                largest += String.valueOf(s.charAt(i));
                i++;
            }
        }
    }

    return smallest + "\n" + largest;
}

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String s = scan.next();
    int k = scan.nextInt();
    scan.close();

    System.out.println(getSmallestAndLargest(s, k));
}

【问题讨论】:

    标签: java arrays


    【解决方案1】:

    我想一旦我对数组进行排序,index[0] 将等于最小的第一个字母,而index[s.length() - 1] 将等于最大的第一个字母。

    嗯,是的……但这还不够。问题是最小的字母可以在原始字符串中出现多次。最大的字母也是如此。因此,当您在原始字符串中找到(例如)'a' 的实例时,您不知道它是否是最小的 3 字符子字符串的开头。

    有一种更简单的方法。

    提示:如果你有一个由 3 个字符串组成的数组,你如何找到最小和最大的?

    【讨论】:

      【解决方案2】:

      对于这一行:(int) s.charAt(i) == temp[i],你的意思是 temp[0] 而不是 temp[i]?仅当两个字符串之一“welcometojava”和“aaceejlmootvw”在同一索引处具有相同字母时,if 语句才会为真,这不会发生。

      【讨论】:

      • 那么你的下一个问题是 while (i
      【解决方案3】:

      根据您所拥有的,我认为您确实需要以这样一种方式映射字符,即您订购主角,然后返回第一个和最后一个订购的字符。以下是您的 getSmallestAndLargest 方法的修改。

      public static String getSmallestAndLargest(String s, int k) {
              List<String> lexList = new ArrayList<String>();
              StringBuilder word;
      
              if(s.length() < k) {
                  return s;
              }
      
              for(int i = 0; i < ((s.length() + 1) - k); i++) {
                  int j = i;
                  word = new StringBuilder();
      
                  while (j < (i + k)) {
                      word.append(s.charAt(j));
                      j++;
                  }
      
                  lexList.add(word.toString());
              }
      
              Collections.sort(lexList);
      
              return lexList.get(0) + "\n" + lexList.get(lexList.size()-1);
      }
      

      【讨论】:

      • 您可能需要注意您修复的主要错误,即使用 i &lt; k,它只适用于前几个字符,然后就无法按预期进行。
      • 呃——为什么要投?这是一件非常讨厌且完全没有必要的事情。 new String 和字符串连接的用法也很糟糕......
      • 啊,替代品...请继续
      • 此外,该代码对重复字符也不可靠 - 它假定长度为 k 的第一个子字符串以第一个字母开头唯一标识。这与String "aaab" 是完全不正确的。
      • P.S.在循环外部声明仅在循环内部使用的东西只会降低代码的可读性。始终尝试在分配时声明。
      猜你喜欢
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 2022-01-15
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 1970-01-01
      相关资源
      最近更新 更多