字符串
class Solution {
public void reverseString(char[] s) {
int left=0,right=s.length-1;
while(left<right){
char ch = s[left];
s[left]=s[right];
s[right]=ch;
left++;
right--;
}
}
}
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for(int i=0;i<ch.length;i+=2*k){
int l=i;
// 判断尾数够不够k个来取决end指针的位置
int r = Math.min(ch.length - 1,l+ k - 1);
while(l<r){
char tmp = ch[l];
ch[l]=ch[r];
ch[r]=tmp;
l++;
r--;
}
}
String res=new String(ch);
return res;
}
}
- 方法1:数组替换
class Solution {
public String pathEncryption(String path) {
char[] ch = path.toCharArray();
for(int i=0;i<ch.length;i++){
if(ch[i]=='.'){
ch[i]=' ';
}
}
return new String(ch);
}
}
- 方法2:数组复制
class Solution {
public String pathEncryption(String path) {
//选用 StringBuilder 单线程使用,比较快,选不选都行
StringBuilder sb = new StringBuilder();
for(int i=0;i<path.length();i++){
if(path.charAt(i)=='.'){
sb.append(' ');
}else{
sb.append(path.charAt(i));
}
}
return sb.toString();
}
}
- 方法3:库函数
class Solution {
public String pathEncryption(String path) {
return path.replace('.',' ');
}
}
方法4:双指针
programmercarl.com/%E5%89%91%E…
本题题目改了,所以用双指针不需要再扩充内存。我自己改后的代码也在下面
class Solution {
public String pathEncryption(String path) {
//定义扩充空间,本题这一步可以不用
StringBuilder sb = new StringBuilder();
for(int i=0;i<path.length();i++){
if(path.charAt(i)=='.'){
// sb.append(' ');
}
}
//双指针法,左指针指向原数组的最后,右指针指向扩展数组的最后
int left=path.length()-1;
path+=sb.toString();
int right=path.length()-1;
char[] ch = path.toCharArray();
while(left>=0){
if(ch[left]=='.'){
ch[right]=' ';
}else{
ch[right]=ch[left];
}
left--;
right--;
}
String res=new String(ch);
return res;
}
}
- 双指针,自己想的
快慢指针都指向终点,快指针向前走,找到空格则把单词记到res中,慢指针指向left-1。再继续走直到快指针走完字符串
注意点:1、为了方便可以先删除首尾空格;2、连续空格的处理比较细节;3、按照我的思路最后一个单词会被省略所以要处理一下
class Solution {
public String reverseWords(String s) {
s = s.trim(); //删除首尾空格
int left=s.length()-1;//快指针
int right=s.length()-1;//慢指针
String res = new String();
char[] ch=s.toCharArray();
while(left>=0){
int flag=0;
if(ch[left]==' '){
for(int i=left+1;i<=right;i++){
if(ch[i]!=' '){//跳过连续空格
res+=ch[i];
flag=1;
}
}
if(flag==1){
res+=' ';
}
right=left-1;
}
left--;
if(left==-1&&ch[0]!=' '){//记录最后一个单词
for(int i=left+1;i<=right;i++){
res+=ch[i];
}
}
}
return res;
}
}
- 双指针优化
自己的思路有点复杂。
leetcode.cn/problems/re… 大神写的更简单。先用快指针找到空格,再添加单词和空格,中间遇到连续空格则跳过,慢指针指向下个单词尾。
public String reverseWords(String s) {
s = s.trim(); //删除首尾空格
int left=s.length()-1;//快指针
int right=s.length()-1;//慢指针
StringBuilder res = new StringBuilder();
while(left>=0){
while(left >= 0 && s.charAt(left)!=' ') left--;//搜索到空格
res.append(s.substring(left+1,right+1)+' ');//添加单词和空格
while(left >= 0 && s.charAt(left)==' ') left--;//跳过单词间空格
right=left;//right指向下个单词尾
}
return res.toString().trim();
}
}