【牛客-算法】NC57 反转数字

简介: 题目描述原题:NC57 反转数字描述给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果1.只反转数字部分,符号位部分不反转

题目描述

原题:NC57 反转数字

描述

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

1.只反转数字部分,符号位部分不反转屏幕截图 2023-12-28 151322.png

3.假设本题不允许存储 64 位整数(有符号或无符号,即C++不能使用long long ,Java不能使用long等)

数据范围:

image.png

算法设计思路

反转思路:先计算整数的位数,然后通过除法、取模得到首位和末尾的数字,再交换数字。

先减一个数将原来的数字置零,然后加上新数与对应数位的乘积,就可以替换掉一个数位。

不反转符号位:新建一个变量 flag 保留符号位信息,将原数取绝对值,再反转。

超过32位有符号整数范围:若原数 num 满足:

  • 数量级为 10 亿,个位大于 2
  • 数量级为 10 亿,个位为 1 ~ 2,反转后数量级小于 10 亿

则可判断发生了溢出,返回 0。

算法实现(C语言)

#include<limits.h>
int reverse(int x ) {
    if(x == INT_MIN)//INT_MIN取相反数运算,数将不变
    {
        return 0;
    }
    bool fu = false;//x是否为负
    if(x < 0)
    {
        x = -x;
        fu = true;
    }
    int t = x;//x绝对值的备份
    bool big = false;//x的数量级是否为10亿
    if(x > 1000000000)
    {
        big = true;
    }
    int f = 1;//f数量级指向首位,e数量级指向末位;将向中间迭代
    int e = 1;
    while(x / f / 10 > 0) //得到x首位的数量级
    {
        f *= 10;
    }
    while(f > e)
    {
        int fNum = x / f % 10;//得到首、末位数字
        int eNum = x / e % 10;
        x = x - f * fNum + f * eNum;//交换数字
        x = x - e * eNum + e * fNum;
        f /= 10;//向中间迭代
        e *= 10;
    }
    int eNum = t % 10;
    if(big && (eNum > 2 || (eNum != 0 && x < 1000000000)))//反转后溢出
    {
        return 0;
    }
    if(fu)
    {
        x = -x;
    }
    return x;
}

bug记录:一个负数取相反数运算,结果不变

屏幕截图 2023-12-28 151157.png

1518e186c821455fb48a4effa96f187c.png

#include<iostream>
#include<climits>
using namespace std;
int main(){
  int x = INT_MIN;
  cout << x << endl;
  int y = -x;
  cout << "取相反数:" << y << endl;
  return 0;
}

现在已经知道是因为发生了溢出,但为什么溢出了结果数的值不变?大家可以自行了解下二进制补码计数法,即与计算机底层整数的表示方法有关。

运行结果

成功通过!

4e8fa56e848f489a92a60e4e35550bd5.png

结束语:

今天的分享就到这里啦,快来一起刷题叭!

相关文章
|
6月前
《剑指Offer》JZ3 数组中重复的数字
《剑指Offer》JZ3 数组中重复的数字
28 2
|
算法 程序员
【Leetcode】NC31 第一个只出现一次的字符(牛客网)、面试题 01.01. 判定字符是否唯一
题目描述: 描述 在一个长为n字符串中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)
66 0
|
6月前
|
算法 C语言
【牛客-算法】NC56 回文数字
🚩 前言 🔥 该专栏作为算法题笔记,记录算法的思路、遇到的问题,以及能跑的代码,持续更新中! 🔥 推荐一款面试、刷题神器牛客网:👉开始刷题学习👈
55 0
|
6月前
【每日一题Day238】LC1177构建回文串检测 | 前缀和 + 异或
【每日一题Day238】LC1177构建回文串检测 | 前缀和 + 异或
57 0
剑指offerJZ50 数组中重复的数字
剑指offerJZ50 数组中重复的数字
44 0
|
算法 C++
剑指offer(C++)-JZ44:数字序列中某一位的数字(算法-搜索算法)
剑指offer(C++)-JZ44:数字序列中某一位的数字(算法-搜索算法)
|
算法 Java
【算法题目解析】杨氏矩阵数字查找
一道面试时可能遇到的算法问题,杨氏矩阵。可以重点关注思考方式,而不是死记硬背。
39 0
LeetCode竞赛题目—在LR字符串中交换相邻字符
LeetCode竞赛题目—在LR字符串中交换相邻字符
LeetCode竞赛题目—在LR字符串中交换相邻字符
|
机器学习/深度学习 算法 C语言
【牛客-算法】NC55 最长公共前缀
【牛客-算法】NC55 最长公共前缀
115 0
【牛客-算法】NC55 最长公共前缀
|
算法 C++
【牛客-算法】NC52 有效括号序列
【牛客-算法】NC52 有效括号序列
167 0
【牛客-算法】NC52 有效括号序列