回文数、罗马数转整数、整数反转


前言

<来自力扣的三道简单算法题解法分享>

题目一:判断一个整数是否是回文数;
题目二:把输入的罗马数字转换成整数;
题目三:把输入的整数反转后输出。


下面案例仅供参考

一、整数的回文数判断

输入一个整数,判断是否为回文数,是则返回true,否则返回false。 例:输入【-121】,返回false;输入【12321】,返回true。

1、负数和一位数的判断

        if (x < 0)return false;                    //小于0的都不是回文数
        if (x >= 0 && x <= 9)return true;          //0~9是回文数

2、将整数存进vector容器

        vector<int>a;
        int n = 0;
        while (x != 0) {         //整除法存进容器a (头插)
            a.insert(a.begin(), x % 10);
            x /= 10;
            n++;
        }

3、下标mid和next的定位(关键)

        int mid = n / 2 - 1;                        /*定位mid*/
        int Next = 0;
        if (n % 2 == 0)
            Next = mid + 1;                      /*定位偶数的next*/
        else
            Next = mid + 2;                      /*定位奇数的next*/

在这里插入图片描述

4、循环比较并得出结果

        int i = 0, j = 0;
        for (i = mid, j = Next; i >= 0 && j <= a.size(); i--, j++) {
            if (a[i] == a[j])continue;
            else return false;
        }
        return true;

二、罗马数字转整数

1、简介罗马数字

罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 I (1)、V(5)、X(10)、L (50)、C(100)、D (500)、M(1000) 例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。 通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。

这个特殊的规则只适用于以下六种情况:

I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。

2、利用for嵌套switch case语句实现转换:

        for (int i = 0; i < s.size(); i++) {
            switch (s[i]) {
            case 'I': {
                if (s[i + 1] == 'V') { ans += 4; i++; break; }
                if (s[i + 1] == 'X') { ans += 9; i++; break; }
                ans += 1;
            }break;
            case 'V':ans += 5; break;
            case 'X': {
                if (s[i + 1] == 'L') { ans += 40; i++; break; }
                if (s[i + 1] == 'C') { ans += 90; i++; break; }
                ans += 10;
            }break;
            case 'L':ans += 50; break;
            case 'C': {
                if (s[i + 1] == 'D') { ans += 400; i++; break; }
                if (s[i + 1] == 'M') { ans += 900; i++; break; }
                ans += 100;
            }break;
            case 'D':ans += 500; break;
            case 'M':ans += 1000; break;
            }
        }

三、整数反转

输入一个int类型范围的整数,输出反转后的整数
例:
输入【-123】输出【-321】
输入【857】 输出【758】

1、接值,并检查是否为负数

特殊情况:
当输入值为-2147483648时,直接用x=-x会超出int类型的范围
(int类型取值范围:-2147483648 至 2147483647)

        long long y;
        int tap = 0;
        if (x < 0) {    /*检查是否为负数*//*是则将其变为正数并标记*/
            y = x;       /*考虑到当x取-2147483648时,不能用x=-x*/
            y = -y;
            tap = 1;
        }
        else y = x;

2、检查位数(将count乘到与x的一致位数)

        int temp = y;
        long long count = 1;
        while (temp != 0) {    /*整除法检查x的位数*/
            temp /= 10;
            count *= 10;     /*count乘到比x位数多一位*/
        }
        count /= 10;       /*count减少一位,与x位数一致*/

3、利用count进行位数转换

        long long ans = 0;
        while (y != 0) {        //利用count进行位数转换
            ans += ((y % 10) * count);
            y /= 10;
            count /= 10;
        }

4、处理两种特殊情况

 if (ans < -2147483648 || ans>2147483647)return 0; 
 /*如果超出int的范围则返回0*/
 if (tap == 1) ans = -ans;
 /*如果标记为1则将结果置为负数*/

总结

提示:这里对文章进行总结:
以上就是今天分享的三个内容,会有更优的解法,继续加油!

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莉妮可丝的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值