Leetcode:整数反转

题目链接: 7. 整数反转 - 力扣(LeetCode)

普通版本(翻转字符串)

cpp 复制代码
class Solution {
public:
    int reverse(int x) {
        //将整数变成字符串
        string s=to_string(x);
        int flag=0;//flag用于标识原来的整数是否为负

        //去掉负号
        if(s[0]=='-')
        {
            flag=1;//如果是则将flag赋值为1,为后续将翻转后的整数变为负做准备
            s=s.substr(1);
        }

        std::reverse(s.begin(),s.end());//翻转字符串,要使用std提供的反转函数,否则容易于当前函数起冲突

        long ll=stol(s.c_str());//先将翻转后的字符串转换c语言的类型的字符串,然后再用stol将该字符串转换为为长整型

        if(flag==1)
        {
            ll=-ll;    
        }

        if(ll>INT_MAX||ll<INT_MIN)//简单的判断
            return 0;
        return (int)ll;
    }
};
  • 不使用stoi而是stol是因为如果字符串表示的整数超出了int类型的范围,将导致溢出,stoi函数将抛出out_of_range的异常信号***(但是有可能不超过也会报错,可能是因为编译器的原因,所以我们使用stol最后输出时将long强转为int即可)***
  • C++提供的substr用于提取指定长度的字符串,C语言封装一个strcpy函数也可以实现该功能
cpp 复制代码
#include <stdio.h>
#include <string.h>

void substr(const char* source, char* target, int start, int length) {
    strncpy(target, source + start, length);
    target[length] = '\0'; // 添加字符串结束符
}

int main() {
    char source[] = "Hello, World!";
    char target[20]; // 目标字符串

    substr(source, target, 7, 5); // 从第7个字符开始,提取长度为5的子字符串

    printf("提取的子字符串: %s\n", target);

    return 0;
}

优化版本(循环翻转)

1、32位机器上,整数的取值范围是-2,147,483,648 (-2^31) 到 2,147,483,647 (2^31 - 1)

2、无论多少位的机器,判断某个整数在某一次是否越界主要是通过几种方式***(假设该整数为x)***

①x是否大于INT_MAX / 10、或x是否小于 INT_MIN / 10,满足则不越界,不满足就是越界

②x是否等于INT_MAX / 10 且该数的最后一位是否大于7,满足则越界,不满足则不越界

x是否等于INT_MIN / 10 且该数的最后一位是否小于-8,满足则越界,不满足则不越界

cpp 复制代码
class Solution {
public:
    int reverse(int x) {
        int rev = 0;
        //循环取模
        while (x != 0) 
        {
            int pop = x % 10;//pop为翻转前x的最后一位数字和翻转后rev的最后一个字符
            x /= 10;//原整数一直缩减
            
            //先判断之前翻转后的整数的是否越界
            if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
            rev = rev * 10 + pop;//rev表示每一次反转后的整数,每次翻转都会整体*10进位为pop留出一个位置
        }
        return rev;
    }
};
  • 如果只用if(rev > INT_MAX / 10 || rev < INT_MIN / 10)还是不够准确,因为如果是2,147,483,648那么就是越界**,而如果是2,147,483,647或** **2,147,483,646****就不会越界**

补充:

1、C++整型转字符串:to_string

2、C语言整型转字符串:sprintf函数将整数num转换为字符串并存储在str

3、C++字符串转整型:stoi

4、C语言字符串转整型:atoi

5、C++翻转字符串:std::reverse

7、C语言翻转字符串:双指针自行实现

8、C++字符串转换为长整型:stol

~over~

相关推荐
心中有国也有家3 分钟前
hixl:昇腾分布式推理的「快递专线」
人工智能·经验分享·笔记·分布式·学习·算法
爱睡懒觉的焦糖玛奇朵7 小时前
【从视频到数据集:焦糖玛奇朵的魔法工具使用说明】
人工智能·python·深度学习·学习·算法·yolo·音视频
Runawayliquor7 小时前
opbase:CANN 所有算子的公共地基
大数据·数据库·人工智能·算法
徐安安ye7 小时前
FlashAttention 为什么对序列长度这么“敏感”?
人工智能·算法
黎阳之光9 小时前
黎阳之光:以视频孪生重构智能监盘,为燃机打造新一代智慧电厂大脑
大数据·人工智能·算法·安全·数字孪生
绝知此事9 小时前
【算法突围 02】树形结构与数据库索引:树形结构与数据库索引:从 BST 到 B+ 树的演化与 MySQL 优化
数据库·mysql·算法·面试·b+树
清木!10 小时前
排序算法比较
数据结构·算法·排序算法
dayuOK630710 小时前
AI内容创作工具的下一个战场:从“生成”到“全流程自动化”
运维·人工智能·chatgpt·职场和发展·自动化·新媒体运营·媒体
吴可可12310 小时前
用Teigha修改并保存CAD文件
数据库·算法·c#
灰灰勇闯IT11 小时前
ops-reduce:ReduceMax 与 ReduceMean 的并行优化
算法