剑指 Offer 58 - I. 翻转单词顺序 解题思路详解

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

示例 1:

输入: “the sky is blue”
输出: “blue is sky the”
示例 2:

输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:
1.无空格字符构成一个单词。
2.输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
3.如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

方法1

split把字符串按照指定的分割符进行分割,然后返回字符串数组

public String reverseWords(String s) {
        String[] str = s.split(" ");//按照空格进行分割
		StringBuilder sb = new StringBuilder();
		for(int i = str.length - 1;i >= 0;i--)//把字符串数组str中的元素从后往前进行遍历
		{
			if(!str[i].equals(""))//过滤空字符串
            {
                sb.append(str[i]);//追加到sb中
			    sb.append(" ");//每个字符串后面添加空格
            }
		}
		return sb.toString().trim();//用toString()方法把sb转换成字符串,用trim()去掉字符串首尾的空格
    }
方法1中遇到的问题分析
1)为什么过滤空字符串 if(!str[i].equals(""))

我们对上面的代码稍微进行更改,看看输出结果(方法内的输出结果)

public static String reverseWords(String s) {

		String[] str = s.split(" ");
		for(int i = 0;i < str.length;i++)
		{
			System.out.print(str[i] + ",");
		}
		System.out.println();
		System.out.println("s的长度:" + s.length());
		System.out.println("str的长度:" + str.length);
		
		StringBuilder sb = new StringBuilder();
		for(int i = str.length - 1;i >= 0;i--)
		{
			if(!str[i].equals(""))
            {
                sb.append(str[i]);
			    sb.append(" ");
            }
		}
		return sb.toString().trim();
    }

输入:dssdsd  dsdsds   dssd
输出:dssdsd,,dsdsds,,,dssd,
s的长度:21
str的长度:6

输入:aaaaaaaaaaa                 sssss    eweww
输出:aaaaaaaaaaa,,,,,,,,,,,,,,,,,sssss,,,,eweww,
s的长度:42
str的长度:22

可以发现str数组中还是有个很多空字符串,这些都是我们不需要的所以要过滤。

2)过滤的时候equals里为什么不用null或空格(" “),而是用(”")

三者之间的区别如下:
(1) “” 是一个空字符串,是个对象, 长度为0 占内存 在内存中分配一个空间,可以使用Object对象的方法
(2)null是空引用,表示一个对象的值 没有分配内存,调用null的字符串的方法会抛出空指针异常。null不是对象。因此Null之间可以用双等号比较值 而"“不可以用双等号比较值 但是可以用双等号来比较地址
(3)” "空格字符串 此字符有对应的ASCII码,跟abcd什么的没有区别

使用null
public static String reverseWords(String s) {
        
		String[] str = s.split(" ");
		StringBuilder sb = new StringBuilder();
		for(int i = str.length - 1;i >= 0;i--)
		{
			if(!str[i].equals(null))
            {
                sb.append(str[i]);
			    sb.append(" ");
            }
		}
		System.out.println(sb.toString().trim());
		return sb.toString().trim();
    }
输入:dssdsd  dsdsds   dssd
输出:dssd   dsdsds  dssdsd

输入:aaaaaaaaaaa                 sssss    eweww
输出:eweww    sssss                 aaaaaaaaaaa

可以发现使用null后结果不是我们想要的

使用空格

把上面代码的null用空格(" ")替换就可以了,最后发现结果还是不是我们要的

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AEKSAN

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值