敲了半天代码来和大家分享一下心得。

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;
    }


}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值