反转字符串
这道题没什么,迄今为止遇到最简单的了吧
反转字符串II
这道题自己试了差不多1个小时多吧,想想真是可笑,刚开始觉得很简单,直接上手写了,但是发现条件老是露。想着边写边优化,没想到越写越乱,唉!!然后纸上画了一下,再写,还是没完全包含进去。。。好吧,还是太菜了,总有一天我会秒解这道题的!!!
- String不可变。String 是引用类型数据,其值是无法改变,如果想要像C语言那样修改字符串那么只能通过StringBuilder类来操作字符串。StringBuilder是可变的。
class Solution {
public String reverseStr(String s, int k) {
int count;
//感觉用双指针很合适
int left = 0;
int right = 0;
char temp = 0;
int i = 0;
StringBuilder sb = new StringBuilder(s);
//i是2k的整数倍
while(i % (2*k) == 0 && i <= s.length()){
if(i == 0){
i += 2*k;
continue;
}
left = i - 2*k;
right = i - k -1;
while(left < right){
temp = sb.charAt(left);
// s.charAt(left) = s.charAt(right);
// s.charAt(right) = temp;
sb.setCharAt(left,sb.charAt(right));
sb.setCharAt(right,temp);
left ++;
right --;
}
i += 2*k;
}
//字符串长度小于k
if(s.length() - i < k){
left = 0;
right = s.length() - 1;
while(left < right){
temp = s.charAt(left);
sb.setCharAt(left,s.charAt(right));
sb.setCharAt(right,temp);
left ++;
right --;
}
}else{
left = i;
right = i + k - 1;
while(left < right){
temp = s.charAt(left);
sb.setCharAt(left,s.charAt(right));
sb.setCharAt(right,temp);
left ++;
right --;
}
}
return s;
}
}
先留着吧,等最后回头来做
替换空格
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
另外还可以使用setlength
StringBuilder是线程不安全的,使用起来更快,一般都用这个。
import java.util.*;
public class Solution {
public String replaceSpace(StringBuffer str) {
//先扩容--->扩容到空格数 * 占位数
int count = 0;
for(int i = 0;i < str.length();i++){
if(str.charAt(i) == ' '){
count++;
}
}
//怎么扩充stringbuffer的长度呢?
//扩充的char是应该按照空格放进去呢?还是按照空字符
int left = str.length()-1 ;
str.setLength(count * 3 +str.length());
int right = str.length()-1 ;
while(left >= 0 && left < right){
if(str.charAt(left) == ' '){
//怎么能一次性赋值三个字符串呢
str.charAt(right) = '0';
right --;
str.charAt(right) = '2';
right --;
str.charAt(right) = '%';
right --;
}
str.setCharAt(right,str.charAt(left));
}
return str.toString;
}
}
上面代码中的错误:
- toString后面加()
修改后的代码:
import java.util.*;
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str == null || str.length() ==0){
return str.toString();
}
//先扩容--->扩容到空格数 * 占位数
int count = 0;
for(int i = 0;i < str.length();i++){
if(str.charAt(i) == ' '){
count++;
}
}
//怎么扩充stringbuffer的长度呢?
//扩充的char是应该按照空格放进去呢?还是按照空字符
int left = str.length()-1 ;
str.setLength(count * 3 +str.length());
int right = str.length()-1 ;
while(left >= 0 && left < right){
if(str.charAt(left) == ' '){
//怎么能一次性赋值三个字符串呢
str.setCharAt(right,'0');
right --;
str.setCharAt(right,'2');
right --;
str.setCharAt(right,'%');
right --;
}else{
str.setCharAt(right--,str.charAt(left));
}
left--;
}
return str.toString();
}
}
但是还是报错了:
目前不知道哪里错了~
今天搞了一晚上3道题也没搞完,唉,先这样吧。。。
胡汉三又回来啦!!!
下面是修改过的代码,其实就是count * 3那里写错了,应该是*2,因为,原来字符串里面的空格也是占了一个位置的
import java.util.*;
public class Solution {
public String replaceSpace(StringBuffer str) {
if(str == null || str.length() ==0){
return str.toString();
}
//先扩容--->扩容到空格数 * 占位数
int count = 0;
for(int i = 0;i < str.length();i++){
if(str.charAt(i) == ' '){
count++;
}
}
//怎么扩充stringbuffer的长度呢?
//扩充的char是应该按照空格放进去呢?还是按照空字符
int left = str.length()-1 ;
str.setLength(count * 2 +str.length());
int right = str.length()-1 ;
while(left >= 0 && left < right){
if(str.charAt(left) == ' '){
//怎么能一次性赋值三个字符串呢
str.setCharAt(right,'0');
right --;
str.setCharAt(right,'2');
right --;
str.setCharAt(right,'%');
right --;
}else{
str.setCharAt(right--,str.charAt(left));
}
left--;
}
return str.toString();
}
}
翻转字符串里的单词
这道题又搞了1个多小时
- 没搞明白为什么按照while那样写
- String(chars) 和 stringbuilder.toString方法的不同使用
左旋转字符串
尝试手撕左旋转字符串(写到下面这的时候发现,前面num个字符被我已经赋值过了,如果先保留,我可能会开另一个数组存一下。看看题解吧~)
int start =0;
int end = start + num;(num表示要旋转多少个)
char temp = ' ';
char[] chars = str.toCharArray();
while(end < chars.length){
temp =chars[start];
chars[start] = chars[end];
chars[end] = temp;
end ++;
start ++;
}
局部反转 + 全局反转的思路真的是绝了~~~