13/100 N字形变换 14/100整数反转 15/100字符串转换整数atoi 16/100回文数

2023-12-20 11:59:28

题目13/100:N字形变换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

P A H N
A P L S I I G
Y I R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。

请你实现这个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

题解

class Solution {
public:
    string convert(string s, int numRows) {
        if(numRows == 1) return s;
        vector<string> tmpString(numRows);
        bool direct = false;//因为i==0 初始是true 进循环就变成false i下一把就小于0  
        int i = 0;
        string res;
        for(auto c: s)
        {
            tmpString[i] += c;
            if(i == 0 || i == numRows-1)
            {
                //要改变方向
                direct = !direct;
            }
            i += direct?1:-1;//往下就+1  往上-1
        }
        for(auto str: tmpString)
        {
            res += str;
        }
        return res;
    }
};

题目:14/100整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [?231, 231 ? 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
在这里插入图片描述

题解:

思路上讲挺简单,依次取到最后一位,再除以10更新数字

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        int num = 0;
        while(x)
        {
            num = x%10;
            x = x/10;
            res = res*10 + num;
        }
        if(res > INT_MAX  || res<INT_MIN )
        return 0;
        return res;
    }
};

//除10取余 得到最后一位  x=x除以10
//*10+得到的数目

默认的测试案例可以通过,但提交报错
在这里插入图片描述
添加到测试案例,发现是当x = 1534236469时有问题,在最后一个循环的rev=964632435, res = res*10 + num > INT_MAX 发生溢出
在这里插入图片描述

res = res*10 + num;//有可能会溢出,所以在这之前就要判断是否满足

?2^31≤res*10 + numt≤2^31?1

修改后代码:

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        int num = 0;
        while(x)//也会存在负数  非0是true
        {
             if(res > INT_MAX/ 10  || res<INT_MIN/ 10 ) //?2^31≤res*10 + numt≤2^31?1
                return 0;

            num = x%10;
            x = x/10;
            res = res*10 + num;//有可能会溢出,所以在这之前就要判断是否满足
        }
       
        return res;
    }
};

//除10取余 得到最后一位  x=x除以10
//*10+得到的数目

题目:15/100 字符串转换整数

请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。

函数 myAtoi(string s) 的算法如下:

读入字符串并丢弃无用的前导空格
检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。
读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。
将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。
如果整数数超过 32 位有符号整数范围 [?231,  231 ? 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 ?231 的整数应该被固定为 ?231 ,大于 231 ? 1 的整数应该被固定为 231 ? 1 。
返回整数作为最终结果。

注意:

本题中的空白字符只包括空格字符 ' ' 。
除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。

在这里插入图片描述

题解:

根据题目要求写的ifelse

class Solution {
public:
    int myAtoi(string s) {
        bool isNeg = false;
        bool isStart = false;
        int num = 0;
        for(auto c: s)
        {
            //判断是不是空格
            if(c == ' ')
            continue;

            if(c == '-' && isStart == false)
            {
                isNeg = true;
                continue;
            }else if(c == '+' && isStart == false )
            {
                isNeg = false;
                continue;
            }
            // else if(0<=(c-'0')<=9)
            else if (isdigit(c))
            {
                isStart = true;//开始正文了
                //提取数字
                if(num<INT_MIN/10) break;
                if(num>INT_MAX/10) break;
                num = num*10 + (c-'0');
            
            }
             else
             {
                isStart = true;
                return num;
            }
        }
       
        return isNeg?-num:num;
    }
};

解题错误,只通过了部分测试用例:在这里插入图片描述
修改之后不断有case报错,

class Solution {
public:
    int myAtoi(string s) {
        bool isNeg = false;
        bool isStart = false;
        int num = 0;
        for(auto c: s)
        {
            //判断是不是空格
            if(c == ' ')
            continue;

            if(c == '-' && isStart == false)
            {
                isNeg = true;
                isStart = true;
                continue;
            }else if(c == '+' && isStart == false )
            {
                isNeg = false;
                isStart = true;
                continue;
            }
            // else if(0<=(c-'0')<=9)
            else if (isdigit(c))
            {
                isStart = true;//开始正文了
                //提取数字
                if(num<INT_MIN/10 || num>INT_MAX/10){
                    return isNeg?INT_MIN:INT_MAX;
                }
                num = num*10 + (c-'0');
            
            }
             else
             {
                isStart = true;
                break;
            }
        }
       
        return isNeg?-num:num;
    }
};


在这里插入图片描述

应该换种思路,或者思路更全面一些,有一些些烦了,做下一题换换脑子

如果面试中遇到类似的问题,应先仔细阅读题目文字说明和示例,有疑惑的地方和需要和面试官确认,在编码的时候需要耐心和细心地调试 切记烦躁慌张

在这里插入图片描述累累了

16/100回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。

在这里插入图片描述

题解:

边界条件:负数,个位为0的非零数
判断条件:把前部分翻转 是否和后部分相等

class Solution {
public:
    bool isPalindrome(int x) {
        if(x<0 || (x % 10 == 0 && x != 0)) return false;
        //转换数字,是否与原来数字相等
        int reverseNum = 0;
        while(x>reverseNum)//优化,只反转一半的数字
        {
            reverseNum = reverseNum*10 + x%10;
            x /= 10;
        }
    // 当数字长度为奇数时,我们可以通过 reverseNum/10 去除处于中位的数字。中位数没有关系
    return reverseNum == x || reverseNum/10 == x;
    }
};

文章来源:https://blog.csdn.net/qq_37299596/article/details/134965205
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。