问题:
给定3个单词w1、w2和w3作为输入,输出字典中介于两者之间的单词。不使用任何字符串函数
public String middleWord(String word1,String word2,String word3){
String str="";
for(int i=0;(i<word1.length()||i<word2.length()||i<word3.length());i++){
char ch1=word1.charAt(i);
char ch2=word2.charAt(i);
char ch3=word3.charAt(i);
if(ch1<=ch2 && ch2<=ch3)
str=str+ch2;
else if(ch2<=ch1 && ch1<=ch3)
str=str+ch1;
else if(ch1<=ch3 && ch3<=ch2)
str=str+ch3;
}
return str;
}
当我运行代码时,一些测试用例返回null,该怎么办?
Testcase | Pass/Fail | Parameters | Actual Output | Expected Output
#1 | Pass | 'cat' 'bat' 'rat' | cat | cat
#2 | Fail | 'go' 'went' 'gone' | null | gone
public String middleWord(String word1,String word2,String word3){
int i=0;
int j=0;
int k=0;
char ch1= 'u0000';
char ch2= 'u0000';
char ch3= 'u0000';
while(i<word1.length()||j<word2.length()||k<word3.length()){
if(i<word1.length()){
ch1=word1.charAt(i++);
}
if(j<word2.length()){
ch2=word2.charAt(j++);
}
if(k<word3.length()){
ch3=word3.charAt(k++);
}
if(ch2>ch1&&ch2<ch3)
return word2;
if(ch1>ch2&&ch1<ch3)
return word1;
if(ch3>ch1&&ch3 < ch2)
return word3;
if(ch1==ch2){
i++;
j++;
while(i<word1.length()||j<word2.length()){
if(i<word1.length()){
ch1=word1.charAt(i);
i++;
}
if(j<word2.length()){
ch2=word2.charAt(j);
j++;
}
if(ch2>ch1)
return word2;
else
return word1;
}
}
else if(ch2==ch3){
j++;
k++;
while(j<word2.length()||k<word3.length()){
if(j<word2.length()){
ch1=word1.charAt(j);
j++;
}
if(k<word3.length()){
ch2=word2.charAt(k);
k++;
}
if(ch2>ch1)
return word3;
else
return word2;
}
}
else if(ch1==ch3){
i++;
k++;
while(i<word1.length()||k<word3.length()){
if(i<word1.length()){
ch1=word1.charAt(i);
i++;
}
if(k<word3.length()){
ch2=word3.charAt(k);
k++;
}
if(ch2>ch1)
return word3;
else
return word1;
}
}
}
return "bad";
}
此代码通过了所有测试用例,没有在字符串中使用任何构建函数。
给定3个单词w1、w2和w3作为输入,输出字典中介于两者之间的单词。
public static String middleWord(String word1, String word2, String word3) {
int i=0;
int j=0;
int k=0;
char ch1= 'u0000';
char ch2= 'u0000';
char ch3= 'u0000';
while(i<word1.length()||j<word2.length()||k<word3.length()){
if(i<word1.length()){
ch1=word1.charAt(i++);
}
if(j<word2.length()){
ch2=word2.charAt(j++);
}
if(k<word3.length()){
ch3=word3.charAt(k++);
}
if(ch2>ch1&&ch2<ch3)
return word2;
if(ch1>ch2&&ch1<ch3)
return word1;
if(ch3>ch1&&ch3 < ch2)
return word3;
if(ch1==ch2){
i++;
j++;
String res=compare(word1,word2,i,j);
return res;
}
else if(ch2==ch3){
j++;
k++;
String res=compare(word2,word3,j,k);
return res;
}
else if(ch1==ch3){
i++;
k++;
String res=compare(word1,word3,i,k);
return res;
}
}
return "bad";
}
public String compare(String str1,String str2,int n1,int n2){
char ch1= 'u0000';
char ch2= 'u0000';
while(n1<str1.length()||n2<str2.length()){
if(n1<str1.length()){
ch1=str1.charAt(n1);
n1++;
}
if(n2<str2.length()){
ch2=str2.charAt(n2);
n2++;
}
if(ch2>ch1)
return str2;
else
return str1;
}
return "poor";
}
}
我通过制作一个函数来缩短我的程序,该函数比较给定字符串的两个字符。当任意两个字符相同时,我们使用此函数来选择字典中哪个字符第一,哪个字符第二。
如果我没有误解你想要做的事情,我认为这些简单的更改会起作用。。。
public static String middleWord(String word1, String word2, String word3) {
for (int i = 0; (i < word1.length() || i < word2.length() || i < word3.length()); i++) {
char ch1 = 10000;
char ch2 = 10000;
char ch3 = 10000;
if(word1.length() > i){
ch1 = word1.charAt(i);
}
if(word2.length() > i){
ch2 = word2.charAt(i);
}
if(word3.length() > i){
ch3 = word3.charAt(i);
}
if (ch1 <= ch2 && ch2 <= ch3) {
return word2;
} else if (ch2 <= ch1 && ch1 <= ch3) {
return word1;
} else if (ch1 <= ch3 && ch3 <= ch2) {
return word3;
}
}
return null;
}
代码中的问题是,您正在连接字符,当您决定哪个是中间词时,只需要返回它。
正如注释中所述,问题中的代码存在以下问题,但没有采取行动:
- 代码试图构建一个新字符串,但任务是选择一个单词,因此代码从一开始就偏离了目标
- 代码抛出
StringIndexOutOfBoundsException
- 即使没有,也没有任何代码路径可以使代码返回
null
因此,该代码是有缺陷的,并且没有按照描述进行操作。这完全违背了堆栈溢出的最小、完整和可验证原则,尤其是可验证部分。看见https://stackoverflow.com/help/mcve.
同样,试图一次比较一个字母的逻辑也会失败。如果输入是"aa"、"bb"、"ac",那么答案应该是"ac";"ac"<"bb",但如果没有一些主要的状态跟踪,一次比较一个字母是无法检测到这一点的。
假设"不使用任何字符串函数"意味着你不能使用任何内置的函数,你可以写自己的比较。
public static String middleWord(String word1, String word2, String word3) {
int cmp12 = compareWords(word1, word2);
int cmp13 = compareWords(word1, word3);
int cmp23 = compareWords(word2, word3);
if (cmp12 == 0 || cmp13 == 0 || cmp23 == 0)
throw new IllegalArgumentException("Found equal words: " + word1 + ", " + word2 + ", " + word3);
if (cmp12 < 0) { // word1 < word2
if (cmp23 < 0) // word2 < word3
return word2; // word1 < word2 < word3
if (cmp13 < 0) // word1 < word3
return word3; // word1 < word3 < word2
return word1; // word3 < word1 < word2
}
if (cmp13 < 0) // word1 < word3
return word1; // word2 < word1 < word3
if (cmp23 < 0) // word2 < word3
return word3; // word2 < word3 < word1
return word2; // word3 < word2 < word1
}
private static final int compareWords(String word1, String word2) {
for (int i = 0; i < word1.length(); i++) {
if (i == word2.length())
return 1; // word1 > word2 (word2 shorter and compared equal until now)
char ch1 = word1.charAt(i);
char ch2 = word2.charAt(i);
if (ch1 < ch2)
return -1; // word1 < word2
if (ch1 > ch2)
return 1; // word1 > word2
}
if (word2.length() > word1.length())
return -1; // word1 < word2 (word1 shorter and compared equal until now)
return 0; // word1 == word2
}
测试代码:
public static void main(String[] args) {
System.out.println("Expecting 'sit':");
System.out.println(" " + middleWord("sat", "soot", "sit"));
System.out.println(" " + middleWord("soot", "sit", "sat"));
System.out.println(" " + middleWord("sit", "sat", "soot"));
System.out.println("Expecting 'cars':");
System.out.println(" " + middleWord("car", "cart", "cars"));
System.out.println(" " + middleWord("cart", "cars", "car"));
System.out.println(" " + middleWord("cars", "car", "cart"));
System.out.println("Expecting 'ac':");
System.out.println(" " + middleWord("aa", "ac", "bb"));
System.out.println(" " + middleWord("ac", "bb", "aa"));
System.out.println(" " + middleWord("bb", "aa", "ac"));
}
输出:
Expecting 'sit':
sit
sit
sit
Expecting 'cars':
cars
cars
cars
Expecting 'ac':
ac
ac
ac