大家好呀,我是善于思考的编程麒,大家可以叫我麒麒,也可以叫我xin麒呀。
今天分享的这道leetcode是实在是太简单了,对了xin麒也是学生,今天下午四点刚刚下课就去图书馆开始刷题,今天要分享的这道题直接是秒解,xin麒今天太开心了。
下面我们来看看吧。
一、问题描述:
Category | Difficulty | Likes | Dislikes |
---|---|---|---|
algorithms | Easy (78.10%) | 551 | - |
Unknown
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s
的形式给出。
不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
示例 2:
输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
提示:
1 <= s.length <= 105
s[i]
都是 ASCII 码表中的可打印字符
二、思路:
前提引入:
- 定义一个变量end来作为指向数组的末尾元素的指针;
- 题解使用的是普通for循环,其中i作为字符数组的左指针;
- 当反转完成就退出for循环。(循环退出判断条件由此而来)
思路分析:
首先看到该题时,xin麒一开始就想到是对字符数组的两头调换位置。出于处于严谨性,xin麒考虑到如果数组长度是奇数和偶数会不会有影响呢?于是xin麒分析了一下:
- 假如s.length为偶数,那么在s数组的头和尾不断的交换位置时,最后的一个状态便是i的数值仅仅比end大1;也就是说i一直向右走,end一直向左走,最后end指针会走到i指针左边,此时
end < i
。 - 假如s.length为奇数,那么最后一次移动时,
s[i]
和s[end]
中间必定会存在一个元素,i指针向向右移动一步,end指针向左移动一步,刚好此时end等于i
。 - 于是xin麒就知道了当遍历在持续时,i和end只有在
end <= i
时才可以终止循环。
过程:
- 先定义一个end指针,end在循环里不断递减;
- for循环里,i作为指针;
- 每一次循环如果满足
end <= i
,那么就可以退出循环。(直接end<i也可以,不过就是在s.lenght为奇数情况下多交换一步,交换的是最中间的那个元素,相当于白交换了,影响也不大) - 如果不满足
end <= i
那么交换索引end和索引i所对应的元素的字符。
三、题解:
class Solution {
public void reverseString(char[] s) {
int end = s.length - 1;
for (int i = 0; i < s.length; i++) {
if (end < i ){break;}//if (end <= i ){break;}也可以
char ch = s[i];
s[i] = s[end];
s[end--] = ch;
}
}
}