bilibili上边黑马程序员的Java课有一个课后练习题,来来回回改得有一个多小时才用自己的思路做出来,我是小白,大佬勿踩。
题目是:
给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。 返回字符串中最后一个单词 单词是指仅有字母组成、不包含任何空格字符的最大子字符串 如:输入s="Hello world" 输出world 输入s="fly me to moon" moon ......
给大家分享一下我的思路和我的做法:
首先,键盘录入一个字符串(键盘录入用惯了,但是这次也发现了问题,下文会说)。
Scanner sc = new Scanner(System.in); System.out.println("请输入一个英文句子,句子中的最后一个单词不能包含数字!"); String str = sc.next();
以下定义一个判断是否是单词的方法
public static int determineWord(String str) { char[] c = str.toCharArray(); int count = 0; for (int i = c.length - 1; i >= 0; i--) { if (c[i] >= 65 && c[i] <= 90 || c[i] >= 97 && c[i] <= 122) { count++; } else if (c[i] != ' ') { System.out.println("输入中含有除字母和空格外的其它字符,无法继续遍历,请重新输入。"); break; } else break; } return count; }
刚开始写的时候 其实没想给它返回一个计数器count,而是想把最后一个单词正向打印。
这就是后边写的衍生题
其实这才是我当初的思路:
public static String determineWord(String str){ char[] c =str.toCharArray(); String result=""; for (int i = c.length-1; i >=0; i--) { if (c[i]!=' '){ result=c[i]+result; } else break; } return result; }
这个时候还没有判断c[i]不是字母怎么办。
错误范例先给大家放一下:
public static void main(String[] args) {
/*
给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。
返回字符串中最后一个单词
单词是指仅有字母组成、不包含任何空格字符的最大子字符串
如:输入s="Hello world" 输出world
输入s="fly me to moon" moon
......
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个英文句子,句子中的最后一个单词不能包含数字!");
String str = sc.next();
String result = determineWord(str);
System.out.println(result);
}
public static String determineWord(String str){
char[] c =str.toCharArray();
String result="";
for (int i = c.length-1; i >=0; i--) {
if (c[i]!=' '){
result=c[i]+result;
}
else break;
}
return result;
}
你会发现输出的只有空格前的第一个内容: 比如:I love you so much -->I 什么原因导致的呢?不应该是输出much吗? 原因很简单,我们知道当用键盘输入字符串并使用next()来接参数的时候,next()会遇到空格自动换行,并把空格后面的值赋值给下一个next()。(如果后面还有next()的话,没有的话空格后面的赋值将会被回收) 于是乎,如果想键盘录入的话,本题最好使用nextLine(),nextLine()遇空格不停止,遇回车停止。 再将方法代码改进一下,加上对其它字符的判断 本来想连用两个if判断语句嵌套去划分52个字母和空格的,后来一想到如果一开始就限制了字母,后面就不会产生空格了,于是就精简代码用else if判断是否是空格。 public static String determineWord(String str) { char[] c = str.toCharArray(); String result = ""; for (int i = c.length - 1; i >= 0; i--) { if (c[i] >= 65 && c[i] <= 90 || c[i] >= 97 && c[i] <= 122) { result = c[i] + result; //倒序遍历,倒序拼接 } else if (c[i] != ' ') { System.out.println("输入中含有除字母和空格外的其它字符,无法继续遍历,请重新输入。"); break; }else break; } return result; }
以下是关于单词长度及单词长度衍生题的代码:
命名是中文,虽然不符合编程要求,但是对于初学者来说很有用。
package study.byMyself.单词长度及衍生题;
import java.util.Scanner;
public class 单词长度 {
public static void main(String[] args) {
/*
给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。
返回字符串中最后一个单词的长度
单词是指仅有字母组成、不包含任何空格字符的最大子字符串
如:输入s="Hello world" 输出5
输入s="fly me to moon" 输出4
......
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个英文句子,句子中的最后一个单词不能包含数字!");
String str = sc.nextLine();
//I love you so much
/*
这里重点标注一下:
划重点!!!
键盘录入时如果用next(),遇到空格会自动停止,并将空格后的值赋值给下一个next(),
如果用nextLine(),遇到空格不会停止,遇到回车才停止,所以在测试环节出现了以下问题:
如果:将str直接赋值,即 String str = "I love you so much"-->>much
如果:使用键盘录入next()方法,键盘输入"I love you so much"-->>I
再如果:使用nextLine()方法,键盘输入"I love you so much"-->much
*/
int count = determineWord(str);
System.out.println("单词长度:" + count);
}
public static int determineWord(String str) {
char[] c = str.toCharArray();
int count = 0;
for (int i = c.length - 1; i >= 0; i--) {
if (c[i] >= 65 && c[i] <= 90 || c[i] >= 97 && c[i] <= 122) {
count++;
} else if (c[i] != ' ') {
System.out.println("输入中含有除字母和空格外的其它字符,无法继续遍历,请重新输入。");
break;
} else break;
}
return count;
}
}
package study.byMyself.单词长度及衍生题;
import java.util.Scanner;
public class 单词长度衍生题 {
public static void main(String[] args) {
/*
给你一个字符串s,由若干单词组成,单词前后用一些空格字符隔开。
返回字符串中最后一个单词
单词是指仅有字母组成、不包含任何空格字符的最大子字符串
如:输入s="Hello world" 输出world
输入s="fly me to moon" moon
......
*/
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个英文句子,句子中的最后一个单词不能包含数字!");
String str = sc.nextLine();
//不过多赘述,依旧注意 空格和next()不能连用,nextLine()不受空格影响。
String result = determineWord(str);
System.out.println(result);
}
public static String determineWord(String str) {
char[] c = str.toCharArray();
String result = "";
for (int i = c.length - 1; i >= 0; i--) {
if (c[i] >= 65 && c[i] <= 90 || c[i] >= 97 && c[i] <= 122) {
result = c[i] + result;
//倒序遍历,倒序拼接
} else if (c[i] != ' ') {
System.out.println("输入中含有除字母和空格外的其它字符,无法继续遍历,请重新输入。");
break;
}else break;
}
return result;
}
}