编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
这道题很简单,双指针格式练手,为下一题做铺垫
class Solution {
public void reverseString(char[] s) {
int left =0,right = s.length-1;
while(left<right){
char temp = s[right];
s[right] = s[left];
s[left] = temp;
left++;
right--;
}
}
}
官方答案:
双指针:一前一后。如果nums[i]为0,则会i,j表示的数会交换
class Solution {
public void moveZeroes(int[] nums) {
int j=0;
if(nums == null){
return;
}
for(int i = 0;i<nums.length;i++){
if(nums[i] !=0){
int temp = nums[i];
nums[i] = nums[j];
nums[j++] = temp;
}
}
}
}
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入:s = “Let’s take LeetCode contest” 输出:“s’teL ekat edoCteeL tsetnoc”
示例 2:输入: s = “God Ding” 输出:“doG gniD”
提示:
1 <= s.length <= 5 * 104 s 包含可打印的 ASCII 字符。 s 不包含任何开头或结尾空格。 s 里 至少
有一个词。 s 中的所有单词都用一个空格隔开。
这个题是在上个题基础上增添更多的实现,这里的话我借鉴了上一个题,还是使用双指针反转
split()方法:分隔字符串
split(" “) 仅分隔一个空格
split(”\t") 分隔空格
split(“\s”) 正则表达式:表示匹配惹你有空白字符,+表示匹配一次或多次
split(“\s+”) 分隔一个或者多个空格
下面是我自己的做法,耗费的时间空间都很大
class Solution {
public String reverseWords(String s) {
StringBuffer b = new StringBuffer(s);
String c = b.reverse().toString();
String a[] = c.split(" ");
reverse(a);
String m ="";
for(int i = 0;i<a.length;i++){
if(i==a.length-1){
m+=a[i];
}else{
m+=a[i]+" ";
}
}
return m;
}
public void reverse(String [] a){
int left =0,right =a.length-1;
while(left<right){
String d = a[left];
a[left]= a[right];
a[right] = d;
left++;
right--;
}
}
}
官方的解答:
通过i的位置变化,来记下空格的位置,然后再倒着存瑞StringBuffer中,以此类推
class Solution {
public string reverseWords(string s) {
string ret;
int length = s.length();
int i = 0;
while (i < length) {
int start = i;
while (i < length && s[i] != ' ') {
i++;
}
for (int p = start; p < i; p++) {
ret.push_back(s[start + i - 1 - p]);
}
while (i < length && s[i] == ' ') {
i++;
ret.push_back(' ');
}
}
return ret;
}
};
