344.反转字符串
输入:s = ["h","e","l","l","o"] 输出:["o","l","l","e","h"]输入:s = ["H","a","n","n","a","h"] 输出:["h","a","n","n","a","H"]
此题为简单题,对数组元素进行交换即可,交换次数为 n/2 次。
for(int i=0;i<s.length/2;i++){
int j=s.length-i-1;
char c;
c=s[i];
s[i]=s[j];
s[j]=c;
}
541. 反转字符串II
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。输入:s = "abcdefg", k = 2 输出:"bacdfeg"
此题是第二次写了,之前第一次写的时候十分困难,第二次独立完成啦!十分开心!
要点:循环变量每次+ 2k 个(i+=2*k)。然后对剩余为被循环的元素进行长度判断即可。
int i=0;
char[] a=s.toCharArray();
for(;i<s.length()-2*k;i+=2*k){
swap(a,i,k);
}
int j=s.length()-i;
if(j<k){
swap(a,i,j);
}else{
swap(a,i,k);
}
return String.valueOf(a);
}
public static char[] swap(char[] s,int start,int k){
int j = start+k-1;
for(int i=start;i<start+k/2;i++) {
char c;
c = s[i];
s[i] = s[j];
s[j] = c;
j--;
}
return s;
剑指Offer 05.替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1: 输入:s = "We are happy."
输出:"We%20are%20happy."
方法一:创建一个新的字符串存储新字符串
每次对原字符串进行判断是否为空格,若为空格添加%20即可。否则添加原字符串字符。
String ss = "";
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == ' ') {
ss += "%20";
} else {
ss += c;
}
}
return ss;
方法二:创建一个新的字符数组存储新字符串
注意:
①数组长度应定义为 字符串长度的三倍(最大值,假设所有都为空格),防止溢出。
②字符串返回为String的方法:String.copyValueOf(c,0,j);
char[] c=new char[s.length()*3];
int j=0;
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
c[j++]='%';
c[j++]='2';
c[j++]='0';
}else{
c[j++]=s.charAt(i);
}
}
return String.copyValueOf(c,0,j);
151.翻转字符串里的单词
这道题、、之前做过、、也听懂了、、现在又不会了、、明天再重新独立解一遍。。一定要弄懂呜呜呜
本题分为三步:
①去除原字符串多余空格(首+尾+各个单词之间的空格)
②将所有字符串进行翻转
③再将各个单词(空格判断)再进行一次翻转
因此定义三个方法。
(1)去除空格:
双指针。
去除首尾空格:start指针指向头,end指针指向尾。当start、end指针都指向的元素为空格时对指针进行移动。
去除单词内部:当前start指向元素不为空 或者 当前StringBuilder最后一位元素不为空格,存放start指向元素。
public static StringBuilder removeSpace(String s) {
//1.去除首尾空格
int start=0;
int end=s.length()-1;
while (s.charAt(start)==' ')start++;
while (s.charAt(end)==' ')end--;
StringBuilder sb=new StringBuilder();
while (start<=end){
if(s.charAt(start)!=' '||sb.charAt(sb.length()-1)!=' '){
sb.append(s.charAt(start));
}
start++;
}
return sb;
}
(2)翻转字符串
双指针法。
start指针指向头,end指针指向尾。当start<end时,对start和end指向元素进行交换。
public static StringBuilder reverseString(StringBuilder sb, int start, int end) {
while (start<end){
char c=sb.charAt(start);
sb.setCharAt(start,sb.charAt(end));
sb.setCharAt(end,c);
end--;
start++;
}
return sb;
}
注意:StringBuilder如何进行元素设置? --> sb.setCharAt(index,char c);
(3)翻转各个单词
双指针法。
start指针指向当前单词头,end指针指向当前单词尾。
注意:第二个while循环要先进行判断end<sb.length() 再进行字符判断!
否则当end==sb.length时,会直接报错索引越界!
public static void reverseEachWord(StringBuilder sb) {
int start=0;
int end=start+1;
while (start<sb.length()){
while (end<sb.length()&&sb.charAt(end)!=' '){
end++;
}
reverseString(sb,start,end-1);
start=end+1;
end=start+1;
}
}
最后主函数进行调用:
{
StringBuilder sb=deleteSpace(s);
reverse(sb,0,sb.length()-1);
reverseEachWord(sb);
return sb.toString();
}
第二天了、、第三遍做这道题、、终于做出来了呜呜呜