反转字符串
简单题目,前后互换,注意边界。
class Solution {
public void reverseString(char[] s) {
int size = s.length;
for (int i = 0; i < size / 2; i++) {
char tmp;
tmp = s[i];
s[i] = s[size - i - 1];
s[size - i - 1] = tmp;
}
}
}
反转字符串 ||
这题最开始我就是直接模拟的,写了一大堆,就不放上来了。
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i += 2 * k) {
int start = i;
// 判断尾数够不够k个来取决end指针的位置
int end = Math.min(ch.length - 1, start + k - 1);
while (start < end) {
char tmp = ch[start];
ch[start] = ch[end];
ch[end] = tmp;
start++;
end--;
}
}
return new String(ch);
}
}
剑指 Offer 05. 替换空格
第一种解法,直接使用java的StringBuffer类来进行字符添加。
ps:其实可以直接写 return s.replaceAll(" ", “%20”); 不过这样刷题没有意义。
class Solution {
public String replaceSpace(String s) {
StringBuffer sb = new StringBuffer();
char[] ch = s.toCharArray();
for (char c : ch) {
if (c == ' ') {
sb.append("%20");
} else {
sb.append(c);
}
}
return sb.toString();
}
}
第二种解法,双指针
如果对原数组从前向后遍历的话需要移动数组中后面的元素,我们可以先创建一个新数组,确定他的容量,然后再遍历添加即可。
class Solution {
public String replaceSpace(String s) {
char[] ch = s.toCharArray();
int count = 0;
int size = ch.length;
for (int i = 0; i < size; i++) {
if (ch[i] == ' ') {
count++;
}
}
char[] res = new char[size + 2 * count];
int k = res.length - 1;
for (int i = size - 1; i >= 0; i--) {
if (ch[i] ==' ') {
res[k--] = '0';
res[k--] = '2';
res[k--] = '%';
} else {
res[k--] = ch[i];
}
}
return new String(res);
}
}
反转字符串中的单词
class Solution {
public String reverseWords(String s) {
char[] ch = s.toCharArray();
ch = replaceSpace(ch);
reverse(ch, 0 , ch.length - 1);
int start = 0;
for(int i = 0; i <= ch.length; ++i) {
if (i == ch.length || ch[i] == ' ') {
reverse(ch, start, i - 1);
start = i + 1;
}
}
return new String(ch);
}
//替换空格
public char[] replaceSpace(char[] ch) {
int slow = 0;
for(int i = 0; i < ch.length; i++) {
if (ch[i] != ' ') {
if (slow != 0) {
ch[slow++] = ' ';
}
while (i < ch.length && ch[i] != ' ') {
ch[slow++] = ch[i++];
}
}
}
char[] ch1 = new char[slow];
System.arraycopy(ch, 0, ch1, 0, slow);
return ch1;
}
//反转单词
public void reverse(char[] ch, int start, int end) {
while (start < end) {
char tmp = ch[start];
ch[start] = ch[end];
ch[end] = tmp;
start++;
end--;
}
}
}
剑指 Offer 58 - II. 左旋转字符串
我的解法,字符串直接相加,比如 s = “hello”,相加完就是 “hellohello” ,然后根据 n 求一下截取的位置就行了。
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuffer sb = new StringBuffer(s);
String str = sb.append(s).toString();
return str.substring(n, s.length() + n);
}
}
卡哥题解的解法
class Solution {
public String reverseLeftWords(String s, int n) {
char[] ch = s.toCharArray();
reverse(ch, 0, n - 1); //反转前n个
reverse(ch, n, ch.length - 1); //反转后面的
reverse(ch, 0, ch.length - 1); //反转整个
return new String(ch);
}
public void reverse(char[] ch, int start, int end) {
while (start < end) {
char tmp = ch[start];
ch[start] = ch[end];
ch[end] = tmp;
start++;
end--;
}
}
}