1. 转换小写字母
LeetCode709:给你一个字符串s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
每个字母都是有确定的ASCII的,可以根据码表操作子字符串,常见的ASCII范围是:
a-z: 97-122, A-Z: 65-90, 0-9: 48-47
将大写字母转换为小写字母,只需在原来的ASCII基础上加上32即可
代码:
public static String toLowerCase(String s){
int n = s.length();
//将字符串转换为字符数组
char[] chars = s.toCharArray();
for (int i = 0; i < n; i++) {
if (chars[i] >= 65 && chars[i] <= 90){
chars[i] += 32;
}
}
String str = new String(chars);
return str;
}
2. 字符串转换整数
LeetCode8. 本体的题目较长,看原文:
请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个32位有效符号整数(类似C/C++中的atoi函数)。
函数myAtoi的算法如下:
读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为
0
。必要时更改符号(从步骤 2 开始)。如果整数数超过 32 位有符号整数范围
[−231, 231 − 1]
,需要截断这个整数,使其保持在这个范围内。具体来说,小于−231
的整数应该被固定为−231
,大于231 − 1
的整数应该被固定为231 − 1
。返回整数作为最终结果。
注意:
本题中的空白字符只包括空格字符
' '
。除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。
示例 1:
输入:s = "42" 输出:42 解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。 第 1 步:"42"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"42"(读入 "42") ^ 解析得到整数 42 。 由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。
示例2:
输入:s = " -42" 输出:-42 解释: 第 1 步:" -42"(读入前导空格,但忽视掉) ^ 第 2 步:" -42"(读入 '-' 字符,所以结果应该是负数) ^ 第 3 步:" -42"(读入 "42") ^ 解析得到整数 -42 。 由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。
示例 3:
输入:s = "4193 with words" 输出:4193 解释: 第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止) ^ 解析得到整数 4193 。 由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。
示例 4:
输入:s = "-9923762348723" 输出:-2147483648 解释: 第 1 步:"-9923762348723"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"-9923762348723"(读入 '-' 字符,所以结果应该是负数) ^ 第 3 步:"-9923762348723"(读入 9923762348723) ^ 解析得到整数 -9923762348723 。 由于 "-9923762348723" 小于范围 [-231, 231 - 1] 内,最终结果被截断为 -21474836483 。
如果看懂示例那么这个题目你基本上就会了,
几个要点:
根据示例1,要去掉前导空格,
根据示例2,有判断去掉空格后的第一个字符为+和-的情况,默认是+,用sign标识,初始化是1,遇到-号的时候,修正为-1.
判断是否是数字,用ASCII比较,'0' <= c <='9',0如果在前面要将其去掉。
根据示例3,在遇到不是数字的时候要停止,
根据示例4,要在循环内部判断最后是否超出int类型的范围,
注意事项:
1. (res == Integer.MAX_VALUE / 10 && (currchar - '0') > Integer.MAX_VALUE % 10)
这段代码判断是最后一位,判断当前res再加1位,是否会越界
2. res = res * 10 + sign * (currchar - '0');
代表每次都是带着符号相加,负号的话,每次相加都是负号
代码:
public static int myAtoi(String str){
int len = str.length();
char[] charArray = str.toCharArray();
//1.去掉空格
int index = 0;
while (index < len && charArray[index] == ' '){
index++;
}
//2.如果已经遍历完成,针对极端(“ ”)全是空格
if (index == len){
return 0;
}
//3.如果出现符号字符,仅第一个有效,记录正负
int sign = 1;
char firstchar = charArray[index];
if (firstchar == '+'){
index++;
} else if (firstchar == '-') {
index++;
sign = -1;
}
//4.将后面的字符进行转换,题目要求不能用long类型
int res = 0;
while (index < len){
char currchar = charArray[index];
//4.1 先判断不合法的情况
if (currchar > '9' || currchar < '0'){
break;
}
//判断越界情况
//提前乘10,可能会直接越界,所以使用Integer.MAX_VALUE/10,这样一定不会越界
//if后面的判断是最后一位,判断当前res再加1位,是否会越界
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && (currchar - '0') > Integer.MAX_VALUE % 10)){
return Integer.MAX_VALUE;
}
if (res > Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && (currchar - '0') > Integer.MIN_VALUE % 10)){
return Integer.MIN_VALUE;
}
//合法的情况,把每一步的符号都成进去,
//想想为什么带着,sign乘,-‘0’是将字符转换为整数,带上sign乘代表每次都是带着符号相加,比如负数就所有负数相加
res = res * 10 + sign * (currchar - '0');
index++;
}
return res;
}