题1. 344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)
题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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 码表中的可打印字符
这道题比较简单,但也容易出错,基本思路都比较清晰,容易想到。
注意点:
1.关于for循环的特殊使用,用得少,但不能忘;
2.双指针的使用,常用在链表反转等与反转有关的题目上,对此需要熟练的立即反应。
执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了92.95%的用户
内存消耗:44.6 MB, 在所有 Java 提交中击败了94.75%的用户
通过测试用例:477 / 477
双指针法:
class Solution {
public void reverseString(char[] s) {
char temp;
for(int left=0,right=s.length-1;left<right;left++,right--){
temp=s[left];
s[left]=s[right];
s[right]=temp;
}
}
}
题2.541. 反转字符串 II - 力扣(LeetCode) (leetcode-cn.com)
题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
1 <= s.length <= 10^4
s 仅由小写英文组成
1 <= k <= 10^4
这道题的难点在于理清满足哪些条件的时候才需要反转哪些字符:即反转每次下标从2k的倍数开始,长度为k的字符,若字符串长度不足k,则全部反转,其余情况不需反转,无需处理。所以解题时关键在于对上述条件下的字符进行反转。
执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了63.06%的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了82.92%的用户
通过测试用例:60 / 60
模拟法:
class Solution {
public String reverseStr(String s, int k) {
int n=s.length();
char[] arr=s.toCharArray();
for(int i=0;i<n;i+=2*k){
//Math.min(i+k,n)返回i+k与n中较小的那个数,少于k个直接反转
reverse(arr,i,Math.min(i+k,n)-1);
}
return new String(arr);
}
//将第i到k+i个字符反转(也就是每次反转传进来的前k个数值)
//调用到最后,剩下的字符不管他,满足题给的条件2
public void reverse(char[] arr,int left,int right){
while(left<right){
char temp=arr[left];
arr[left]=arr[right];
arr[right]=temp;
left++;
right--;
}
}
}
平平无奇小白程序媛一枚,欢迎各位大佬交流指教,如有不正确的地方,欢迎留言改正,谢谢!!!