您好我正在接受HackerRank上的Java挑战,并遇到了一个我无法用我的代码搞清楚的问题。
提示如下,
给定一个字符串,s和一个整数k,完成该函数,以便它找到字典长度为k的字典最小和最大的子串。
示例输入:
welcometojava
3
示例输出:
ava
wel
最小和最大的子串仅基于第一个整数。所以对于我的解决方案,我决定创建一个整数数组,并用String中可用的每个字符的整数值填充它。
我想,一旦我对数组进行了排序,index [0]将等于最小的第一个字母,而index [s.length() - 1]将等于最大的第一个字母。从那里开始,只要将数组中的每个后续字符连接到相应的最小/最大,只要最小/最大< = k。
通过上面的示例输入,我可以返回最大的“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));
}
答案 0 :(得分:1)
我想,一旦我对数组进行了排序,
index[0]
将等于最小的第一个字母,而index[s.length() - 1]
将等于最大的第一个字母。
嗯,是的......但这还不够。问题是最小的字母可以在原始字符串中出现多次。最大的字母也是如此。因此,当您在原始字符串中找到(例如)'a'
的实例时,您不知道它是否是最小的3字符子字符串的开头。
有一种更简单的方法。
提示:如果你有一个包含3个字符串的数组,你如何找到最小和最大的字符串?
答案 1 :(得分:0)
根据你所拥有的,我认为你真的需要以这样的方式映射字符,即你订购主角,然后返回第一个和最后一个有序字符。以下是对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);
}
答案 2 :(得分:0)
对于行:(int)s.charAt(i)== temp [i],你的意思是temp [0]而不是temp [i]? if语句只有在两个字符串'welcometojava'和'aaceejlmootvw'中的一个在同一索引处具有相同的字母时才会成立,这不会发生。