反转字符串
344.反转字符串
本题比较简单,考虑到双指针逐步向中间移动即可
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
char tmp;
while (left < right) {
tmp = s[right];
s[right] = s[left];
s[left] = tmp;
left ++;
right --;
}
}
}
反转字符串II
541. 反转字符串II
本题看上去比较复杂,其实可以简化为每隔2k个元素翻转前k个元素,如果最后不足k个就全部翻转,那么再写for循环时就不能简单的i++了,应该是i+=2k,另外对于判断的临界条件,可以用特殊情况来处理,看是否需要取=
class Solution {
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i += 2 * k) {
// 是否取等号可以举例判断
if (i + k <= ch.length) {
reverse(ch, i, i+k);
}
else {
reverse(ch, i, ch.length);
}
}
return new String(ch);
}
// 该方法为左闭右开
private void reverse(char[] ch, int i, int j) {
char tmp;
int left = i;
int right = j - 1;
while (left < right) {
tmp = ch[right];
ch[right] = ch[left];
ch[left] = tmp;
left++;
right--;
}
}
}
替换数字
卡码网:54.替换数字
因为在java中String是不能更改的,所以只能另起空间使用StringBuilder,逐个遍历输入字符串,然后在输出字符串中加入对应的内容。本题注意:在ACM模式下输入输出需要自己手写,要熟悉java的输入语句,并且要import Scanner类,另外Character.isDigit可以判断是否为数字
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String str = in.nextLine();
StringBuilder result = new StringBuilder();
for (int i=0; i<str.length(); i++) {
if (Character.isDigit(str.charAt(i))) {
result.append("number");
} else {
result.append(str.charAt(i));
}
}
System.out.println(result);
}
}
翻转字符串里的单词
151.翻转字符串里的单词
本题主要分为三步:1、去除首尾空格以及中间多余空格;2、反转整个字符串;3、反转单个单词。因为java字符串不可变,所以可以使用StringBuilder,要熟悉setCharAt方法,3步中除了第二步简单,1,3都有难度,没有用到算法,但是都有比较好的技巧,比如1中去除中间多余空格时,判断当前字符不为空,那么直接加入sb,如果为空,再判断sb最后一个字符是否为空,如果不为空,那么也要加入sb;另外3中两次while循环判断条件也要掌握
class Solution {
public String reverseWords(String s) {
//去除首尾以及中间多余空格
StringBuilder sb = trimSpace(s);
//将整个字符串反转
reverse(sb, 0, sb.length() - 1);
//将单词反转
reverseWord(sb);
return sb.toString();
}
//去除空格
private StringBuilder trimSpace(String s) {
StringBuilder sb = new StringBuilder();
int left = 0;
int right = s.length() - 1;
//去除首尾空格
while (s.charAt(left) == ' ') {
left++;
}
while (s.charAt(right) == ' ') {
right--;
}
//去除中间多余空格
while (left <= right) {
char c = s.charAt(left);
if (c != ' ') {
sb.append(c);
//或者c为空格,但是sb最后一位不是空格,那么需要将该空格加入
} else if (sb.charAt(sb.length() - 1) != ' ') {
sb.append(c);
}
left++;
}
return sb;
}
//将指定范围内的字符串反转
private void reverse(StringBuilder sb, int left, int right) {
char tmp;
while (left < right) {
tmp = sb.charAt(left);
sb.setCharAt(left++, sb.charAt(right));
sb.setCharAt(right--, tmp);
}
}
//将单个单词反转
private void reverseWord(StringBuilder sb) {
int start = 0;
int end = 0;
int n = sb.length();
//外层循环条件
while (start < n) {
//内层end循环
while (end < n && sb.charAt(end) != ' ') {
end++;
}
reverse(sb, start, end - 1);
start = end + 1;
end ++;
}
}
}
右旋转字符串
卡码网:55.右旋转字符串
本题如果直接使用StringBuilder的方法就没有什么意义,所以为了考察逻辑思维,还是要转化为数组进行操作(或者使用StringBuilder但是不使用其方法)。还是要分为3步:1、先将整个字符串反转,2、将前n个字符反转,3、后面的再反转,所以定义一个反转函数即可,另外注意获取输入数据默认是String,需要使用Integer.parseInt转化为int类型
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String s = in.nextLine();
char[] arr = s.toCharArray();
reverse(arr, 0, arr.length - 1);
reverse(arr, 0, n - 1);
reverse(arr, n, arr.length - 1);
System.out.println(arr);
}
private static void reverse(char[] arr, int left, int right) {
char tmp;
while (left < right) {
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
left++;
right--;
}
}
}