首页 > 解决方案 > 为什么我们在 for 循环中做了 { i < s.length() - k } 请解释一下逻辑。给定字符串 s 和 int k

问题描述

这是字典最小和最大字符串的解决方案,其中我们有输入 Sting s 和 int k ;k 是所需的最小和最大字符串的长度。请浏览此链接问题,它是 statementhackerrank.com/challenges/java-string-compare/problem 我不需要任何更正。我想要的是对“for循环”的解释 i < s.length() - k 背后的逻辑是什么。它在第 4 行,它如何满足字典字符串的条件 –</p>

String smallest = s.substring(0, k);  // Assume
String largest = s.substring(0, k);
String temp;
for(int i = 0; i < s.length() - k + 1;i++)<<<==== please Explain logic in this line
{
    temp = s.substring(i, i + k);
    if(smallest.compareTo(temp) > 0) smallest = temp;
    if(largest.compareTo(temp) < 0) largest = temp;
}
return smallest + "\n" + largest;

}

链接:https ://www.hackerrank.com/challenges/java-string-compare/problem

标签: javastringfor-looplogic

解决方案


for(int i = 0; i < s.length() - k + 1;i++)

在这一行中,我们确保 'i' 不会超过字符串的长度,从而导致 IndexOutOfBounds 异常。

例如,在下面的代码片段中,请注意在 for 循环中,我们正在访问索引 i+1,因此 for 循环中的条件写为 'i < s.length()-1' 而不是 'i < s.length()' 通常是这种情况。

for(int i = 0; i < s.length() - 1; i++){
    if(s.charAt(i+1) == s.charAt(i){
        ...
        ...
    }
}

当 for 循环如下时,变量 'i' 从索引 0 移动到 s.length()-1:

for(int i = 0; i < s.length(); i++)

当 for 循环如下时,变量 'i' 将从索引 0 移动到 s.length()-k:

for(int i = 0; i < s.length()-k; i++)

但是由于我们使用的是 substring 函数,并且在该函数中,不包括结束索引,所以我们在 for 循环中添加 1:

for(int i = 0; i < s.length()-k+1; i++)

我希望我消除了你的疑虑。不要被这个冗长的解释吓倒,慢慢来理解我试图传达的内容。


推荐阅读