目录
字符串类型题目和数组类型题目的解题思路类似
344. 反转字符串
public class ReverseString {
/**
* 双指针交换元素
*
* @param s
*/
public void reverseString(char[] s) {
// 定义双指针
// 双指针逐渐往中间移动,直到双指针会合
for (int left = 0, right = s.length - 1; left < right; left++, right--) {
char tmp = s[right];
s[right] = s[left];
s[left] = tmp;
}
}
}
异或运算的特点:
- 任何数与自身进行异或运算时都能等于0。
- 任何数与0进行异或运算时都能等于自身。
- 异或运算满足结合律和交换律
541. 反转字符串 II
public class ReverseStringII {
/**
* 双指针
*
* @param s
* @param k
* @return
*/
public String reverseStr(String s, int k) {
char[] ch = s.toCharArray();
// 遍历跨度2k
for (int i = 0; i < ch.length; i += 2 * k) {
int start = i;
// end指针取i+k或者字符数组的最后一位
int end = Math.min(i + k - 1, ch.length - 1);
while (start < end) {
// 通过异或运算来反转 也可以用tmp来转换
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}
return new String(ch);
}
}
卡码54.替换数字
其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:
- 不用申请新数组。
- 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
public class ReplaceNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
StringBuffer strBuffer = new StringBuffer();
for (int i = 0; i < s.length(); i++) {
if (Character.isDigit(s.charAt(i))) {
strBuffer.append("number");
} else {
strBuffer.append(s.charAt(i));
}
}
System.out.println(strBuffer);
}
public static void otherMain(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);
}
}