tag字符串-刷题预备知识-1. 字符串的常见方法, 转换技巧 + lt.344 + lt.541 + lt.557 + lt.8(同剑指 Offer 67. 把字符串转换成整数)
lt.344- 反转字符串
[案例需求]

[思路分析]
- 原地修改, 意味着不能使用辅助的数组之类的东西, O(1)额外空间也意味着我们可能会在数组中进行直接的交换.
- 这里我们可以使用双指针法, 具体来说是前后双指针, 一趟遍历, 每次遍历都要进行单个字符的交换, 直到两个指针相遇.
[代码实现]
class Solution {
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
while(left < right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
++left;
--right;
}
}
}
lt.541-反转字符串 II
[案例需求]

[思路分析]

[代码实现]
class Solution {
public String reverseStr(String s, int k) {
//转换为char数组
char[] charArr = s.toCharArray();
int length = charArr.length;
// 每遍历一次2k个, 就反转前k个,
//同时判断剩余元素, 剩余元素 > 2k 继续下一次遍历, 反转
//剩余元素 <2k 但是 >= k, 反转前k个;
//剩余元素 <k. 全部翻转
for(int i = 0; i < length; i += (2 * k)){
int leftCount = length - i;
if(leftCount >= k){
swapArr(charArr, i, i + k - 1);
}else if(leftCount < k){
swapArr(charArr, i, length - 1);
}
//swapArr(charArr, i, Math.min(i + k, length) - 1);
}
return new String(charArr);
}
public void swapArr(char[] charrArr, int begin, int end){
while(begin < end){
char temp = charrArr[begin];
charrArr[begin] = charrArr[end];
charrArr[end] = temp;
begin++;
end--;
}
}
}
lt.557- 反转字符串中的单词 III
[案例需求]

[思路分析一, 一般的解法]
- 先对字符串按照空格进行切割, 切割后返回的是一个String[];
- 然后我们可以遍历这个字符串数组, 每一趟遍历都把string[i]对应的单词进行反转, 一趟遍历下来, 答案也就得到了;
- 如何反转, 即lt.344的左右双指针遍历交换方法;
- 本道题需要注意到的一点是, String类在JAVA语言中是不可变的对象, 所以我们需要把反转后的每个string字符串, 借助StringBuilder, 拼接到一起.
[代码实现]
// 1. 学弱解法
class Solution {
public String reverseWords(String s) {
String[] words = s.split(" ");
StringBuilder sb = new StringBuilder();
for(int i = 0; i < words.length; i++){
char[] x = words[i].toCharArray();
swap(x, 0, x.length - 1);
sb.append(new String(x) + " ");
}
return sb.toString().trim();
}
public void swap(char[] x, int left, int right){
while(left < right){
char temp = x[left];
x[left] = x[right];
x[right] = temp;
++left;
--right;
}
}
}
[思路分析二, 使用相关的API]
- 借助StringBuilder的reverse()方法
class Solution {
public String reverseWords(String s) {
String[] split = s.split(" ");
for (int i=0; i<split.length; i++) {
split[i] = new StringBuffer(split[i]).reverse().toString();
}
return String.join(" ", split);
}
}
剑指Offer 05-替换空格
[案例需求]

[思路分析一, String 方法]
- 对API的熟练使用很有必要
class Solution {
public String replaceSpace(String s) {
return s.replace(" ", "%20");
}
}
[思路分析二, 遍历修改法]
- 把String字符串转换为字符数组char[], 然后遍历, 遇到空格时直接进行替换即可, 但是注意了, 空格是一个字符, 而要替换他的%20是三个字符, 所以我们新建一个三倍原来字符大小的char数组, 然后使用string 的charAt(index)遍历字符串, 遇到空格后, 替换后再放入到原来的字符串.

[代码实现]
class Solution {
public String replaceSpace(String s) {
int len = s.length();
char[] charArr = new char[3*len];
int index = 0;
for(int i = 0; i < len; i++){
char ch = s.charAt(i);
if(ch == ' '){
charArr[index++] = '%';
charArr[index++] = '2';
charArr[index++] = '0';
}else{
charArr[index++] = ch;
}
}
// 这是因为后面还有一些空元素, 我们只需要new一个合适长度的字符串返回即可
return new String(charArr, 0, index);
}
}
时间复杂度:O(n)O(n)。遍历字符串 s 一遍。
空间复杂度:O(n)O(n)。额外创建字符数组,长度为 s 的长度的 3 倍。
[思路分析三, StringBuilder的使用]
- Java中, String类是不可变的, 我们可以使用StringBuilder去拼接字符串.
- 所以本方法中, 可以一边遍历字符, 一边去append()字符, 遇到需要替换的字符, 就替换后append()
- 然后把最终结果由sb.toString() 转为string输出即可.

class Solution {
public String replaceSpace(String s) {
//
StringBuilder sb = new StringBuilder();
for(Character c : s.toCharArray()){
if(c == ' '){
sb.append("%20");
continue;
}
sb.append(c);
}
return sb.toString();
}
}
关于反转等对字符串的处理方法, Java 有哪些API?
A. 对于String类的各种API(重要!)
1. String.join()
String.joins(String. join(“连接符号”, 被连接的字符串或字符);

2. String类的常用方法

使用示例: 点我
3. 字符, 字符串和数字的转换方法:
3.1 字符串 <--> 字符数组, 字节数组

这里还需要补充学习: Java 中的各种拷贝方法学习
3.2 字符串(string)<–> 数字

详细栗子: 点我
3.3 数字 <--> 字符(char)
- 别搞错了奥, 这个数字和字符的互转意思是, 有这么一个字符ch = ‘9’, 转换成数字是num = 9
- 该如何进行转换呢?

为什么这样呢? 这是因为char字符, 除了是一个字符之外, 还是一个ACSII值, 可以用来表示数字.
public class test {
public static void main(String[] args) {
char ch = '2';
int num = ch - '0';//char --> int , 隐式转换
char ch1 = (char) (num + '0'); //char --> int, 强制转换
System.out.println(num);
}
}
B. StringBUilder, StringBuffer的各种常用方法

- 参见: 点我
lt.8- 字符串转换整数(atoi)
[案例需求]

[思路分析一, 学弱解法]

/ 记录参考答案
class Solution {
public int myAtoi(String s) {
//转换为字符数组
char[] charArr = s.toCharArray();
int len = charArr.length;
int index = 0;
//1. 去除前导空格
while(index < len && charArr[index] == ' '){
++index;
}
//1.1 极端用例, 全部为空格(遍历已经完成)
if(index == len)return 0;
//2. 正负号;
// 正数为1, 负数为-1
int sign = 1;
char firstChar = charArr[index];
// char 比较可以用 ==
if(firstChar == '+'){
index++;
}else if(firstChar == '-'){
index++;
sign = -1;
}
//3. 将后序出现的数字字符进行转换, 因为要求整数的位数在32以内(即int类型, 不能为long)
int res = 0;
// while(index < len){
// char curChar = charArr[index++];
// //舍弃不为数组的字符
// if(curChar > '9' || curChar < '0'){
// break;
// }
// }
//提前判断乘以10以后是否越界
while(index < charArr.length && charArr[index] <= '9' && charArr[index] >= '0'){
int digit = charArr[index++] - '0';
if(res > (Integer.MAX_VALUE - digit) / 10){
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
res = res * 10 + digit;
}
return sign * res;
}
}
[思路分析二, 精简一些]
class Solution {
public int myAtoi(String s) {
int sign = 1, ans = 0, index = 0;
char[] array = s.toCharArray();
while (index < array.length && array[index] == ' ') {
index ++;
}
if (index < array.length && (array[index] == '-' || array[index] == '+')) {
sign = array[index++] == '-' ? -1 : 1;
}
while (index < array.length && array[index] <= '9' && array[index] >= '0') {
// int digit = array[index++] - '0'; 等同于下面这行
int digit = Integer.parseInt(String.valueOf(array[index++]));
if (ans > (Integer.MAX_VALUE - digit) / 10) {
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
ans = ans * 10 + digit;
}
return ans * sign;
}
}


浙公网安备 33010602011771号