344.反转字符串
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
- 这道题主要学了一下元素swap的操作
- 用临时变量交换
//假设有整型的a,b变量 int temp=a; a=b; b=temp;
- 用异或运算
a^=b; b^=a; a^=b;
-
a=a+b-(b=a);//用这个算法要注意java里面的数据类型转换
- 用临时变量交换
-
代码:
class Solution {
public void reverseString(char[] s) {
int left=0,right=s.length-1;
while(left<right){
// s[i]^=s[j];
// s[j]^=s[i];
// s[i]^=s[j];
s[left]=(char)(s[left]+s[right]-(s[right]=s[left]));
left++;
right--;
}
}
}
541. 反转字符串II
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public String reverseStr(String s, int k) {
int len=s.length();
int left=0;
char[] arr=new char[len];
arr=s.toCharArray();
int right;
while(left<len){
while(left+2*k-1<len){
right=left+k;
swap(arr,left,right-1);
left=left+2*k;
}
if(left+k-1<len){
swap(arr,left,left+k-1);
}else{
swap(arr,left,len-1);
}break;
}
return String.valueOf(arr);
}
public char[] swap(char[] s,int start,int end){
while(end>start){
s[start]^=s[end];
s[end]^=s[start];
s[start]^=s[end];
start++;
end--;
}
return s;
}
}
剑指Offer 05.替换空格
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public String replaceSpace(String s) {
StringBuffer sb=new StringBuffer();
//int count=0;
/*第一种直接替换
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
sb.append("%20");
}else{
sb.append(s.charAt(i));
}
}
return String.valueOf(sb);
*/
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
//count++;
sb.append(" ");
}
}
if(sb.length()==0) return s;
int left=s.length()-1;
s=s+sb;
int right=s.length()-1;
char arr[]=s.toCharArray();
while(left>=0){
if(arr[left]==' '){
arr[right]='0';
arr[right-1]='2';
arr[right-2]='%';
left--;
right-=3;
}else{
arr[right--]=arr[left--];
}}
return String.valueOf(arr);
}
}
151.翻转字符串里的单词
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
- 两种算法,一种是直接new一个新的字符串,然后for循环,遇到空格就改成'%20',再加到新的字符串里。
- 另一种是用指针
class Solution {
public String reverseWords(String s) {
//先把所有的都反转。
//新建一个stringbuffer ,往后append();
//然后左指针指向第一个不为' '的元素,右指针指向后面第一个为' '的元素。
//如果左指针i指到了s.length(),说明从上次的j到s.length()全是空格,退出循环。
//如果右指针j指向了s.length() 说明从i->j-1都不是空格
//把i,j之间的元素都反转。
//用之前的str+反转后的字符。
int left=0;
int right=-1;
StringBuffer sb=new StringBuffer();
s=reverseWord(s,0,s.length()-1);
while(left<s.length()){
while(left<s.length()&&s.charAt(left)==' '){
left++;//指向第一个不为空的元素或者指向了空串的最后一个
}
if(sb.length()!=0&left < s.length()){
sb.append(' ');
}
right=left;
while(right<s.length()&&s.charAt(right)!=' '){
right++;
}//指向下一为空的元素。
if(left<right){
sb.append(reverseWord(s,left,right-1));
}
left=right;
}
return sb.toString();
}
public String reverseWord(String temp,int i,int j){
char[] arr=temp.toCharArray();
int start=i;
int end=j;
while(j>i){
arr[i]^=arr[j];
arr[j]^=arr[i];
arr[i]^=arr[j];
j--;
i++;
}
String tt=String.valueOf(arr);
return tt.substring(start, end+1);
}
}
剑指Offer58-II.左旋转字符串
链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台
class Solution {
public String reverseLeftWords(String s, int n) {
s=reverseWord(s,0,n-1);
s=reverseWord(s,n,s.length()-1);
s=reverseWord(s,0,s.length()-1);
return s;
}
public String reverseWord(String s,int start,int end){
char[] arr= s.toCharArray();
while(end>start){
arr[start]^=arr[end];
arr[end]^=arr[start];
arr[start]^=arr[end];
end--;
start++;
}
return String.valueOf(arr);
}
}