算法通关村十二关 | 字符串转换

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的算法如下:

  1. 读入字符串并丢弃无用的前导空格

  2. 检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。

  3. 读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。

  4. 将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。

  5. 如果整数数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −231 ,大于 231 − 1 的整数应该被固定为 231 − 1

  6. 返回整数作为最终结果。

    注意:

    • 本题中的空白字符只包括空格字符 ' '

    • 除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

示例 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. 根据示例1,要去掉前导空格,

  2. 根据示例2,有判断去掉空格后的第一个字符为+和-的情况,默认是+,用sign标识,初始化是1,遇到-号的时候,修正为-1.

  3. 判断是否是数字,用ASCII比较,'0' <= c <='9',0如果在前面要将其去掉。

  4. 根据示例3,在遇到不是数字的时候要停止,

  5. 根据示例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;
    }

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值