LeetCode344 反转字符串
题目链接:https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html代码:
public class code344 {
// 翻转字符串
public void reverseString(char[] s) {
char temp;
for (int i = 0; i < s.length / 2; i++) {
temp = s[i];
s[i] = s[s.length - 1 - i];
s[s.length - 1 -i] = temp;
}
}
}
这题比较基础,在后边的题中可以当作函数直接调用
LeetCode541 反转字符串II
题目链接:https://programmercarl.com/0541.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2II.html代码:
public class code541 {
public String reverseStr(String s, int k) {
// 将字符串转换为字符数组
char[] res = s.toCharArray();
for (int i = 0; i < res.length; i += 2 * k) {
int start = i;
int end = Math.min(res.length - 1, start + k - 1);
// 进行反转操作
while (start < end) {
char temp = res[start];
res[start] = res[end];
res[end] = temp;
start++;
end--;
}
}
return new String(res);
}
}
比较基础
卡码网:54.替换数字
题目链接:https://programmercarl.com/kashuma54.%E6%9B%BF%E6%8D%A2%E6%95%B0%E5%AD%97.html代码:
public class Kamacode54 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int len = s.length();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) >= 0 && s.charAt(i) <= '9') {
len += 5;
}
}
char[] ret = new char[len];
for (int i = 0; i < s.length(); i++) {
ret[i] = s.charAt(i);
}
for (int i = s.length() - 1, j = len - 1; i >= 0; i--) {
if ('0' <= ret[i] && ret[i] <= '9') {
ret[j--] = 'r';
ret[j--] = 'e';
ret[j--] = 'b';
ret[j--] = 'm';
ret[j--] = 'u';
ret[j--] = 'n';
} else {
ret[j--] = ret[i];
}
}
System.out.println(ret);
}
}
数组填充问题一般是从后往前,这样不需要对其他元素进行后移的操作
LeetCode151翻转字符串里的单词
public class code151 {
public String reverseWords(String s) {
char[] res = s.toCharArray();
// 去除字符串中多余空格
int slow = 0;
for (int fast = 0; fast < res.length; fast++) {
if (res[fast] != ' ') {
if (slow != 0) {
res[slow++] = ' ';
}
while (fast < s.length() && res[fast] != ' ') {
res[slow++] = res[fast++];
}
}
}
// 创建一个新数组,大小为去掉多余空格后的字符串长度
char[] res1 = new char[slow];
// 复制操作
System.arraycopy(res, 0, res1, 0, slow);
// 先对整体进行一个翻转操作
reverse(res1, 0, res1.length - 1);
// 对每个单词进行翻转
reverseEachWord(res1);
return new String(res1);
}
// 翻转每个单词
public void reverseEachWord(char[] chars) {
int start = 0;
for (int end = 0; end <= chars.length; end++) {
if (end == chars.length || chars[end] == ' ') {
reverse(chars, start, end - 1);
start = end + 1;
}
}
}
public void reverse(char[] chars, int left, int right) {
if (right >= chars.length) {
System.out.println("set a wrong right");
return;
}
while (left < right) {
chars[left] ^= chars[right];
chars[right] ^= chars[left];
chars[left] ^= chars[right];
left++;
right--;
}
}
}
这道题大体思想不难,但是比较考察细节,考察代码能力
卡码网:55.右旋转
题目链接:https://programmercarl.com/kama55.%E5%8F%B3%E6%97%8B%E5%AD%97%E7%AC%A6%E4%B8%B2.html代码:
public class Kamacode55 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = Integer.parseInt(sc.next());
String s = sc.next();
char[] res = s.toCharArray();
reverse(res, 0, res.length - 1);
reverse(res, 0, k - 1);
reverse(res, k, res.length - 1);
System.out.println(res);
}
public static void reverse(char[] chars, int left, int right) {
if (right >= chars.length) {
System.out.println("set a wrong right");
return;
}
while (left < right) {
chars[left] ^= chars[right];
chars[right] ^= chars[left];
chars[left] ^= chars[right];
left++;
right--;
}
}
}
先整体反转一次,然后反转前k个,最后其他元素再反转一次