当前位置: 首页 > news >正文

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

文章目录

  • 🚩写在前面
  • 题目描述
  • 算法设计思路
  • 算法实现(C语言)
    • bug记录:一个负数取相反数运算,结果不变
  • 运行结果
  • 结束语:

🚩写在前面

🔥 该专栏作为算法题笔记,记录算法的思路、遇到的问题,以及能跑的代码,持续更新中!
🔥 推荐一款面试、刷题神器牛客网:👉开始刷题学习👈


题目描述

原题:NC57 反转数字

描述
给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果
1.只反转数字部分,符号位部分不反转
2.反转后整数num超过 32 位的有符号整数的范围 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [231,2311] ,返回 0
3.假设本题不允许存储 64 位整数(有符号或无符号,即C++不能使用long long ,Java不能使用long等)

数据范围:
− 2 31 < = x < = 2 31 − 1 -2^{31} <= x <= 2^{31}-1 231<=x<=2311

算法设计思路

反转思路:先计算整数的位数,然后通过除法、取模得到首位和末尾的数字,再交换数字。
先减一个数将原来的数字置零,然后加上新数与对应数位的乘积,就可以替换掉一个数位。

不反转符号位:新建一个变量 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记录:一个负数取相反数运算,结果不变

感觉这是一个不太容易意识到的 bug,还是数据边界的问题。int 的范围为 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [231,2311],而如果 x 为 − 2 31 -2^{31} 231 ,则它的相反数为 2 31 2^{31} 231,已经超过了 int 的最大值 2 31 − 1 2^{31}-1 2311

在这里插入图片描述

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

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

运行结果

成功通过!
c


结束语:

今天的分享就到这里啦,快来一起刷题叭!
👉开始刷题学习👈


个人主页:CSDN清风莫追

14天阅读挑战赛

相关文章:

  • 福昕电子签章服务正式上线:文档签,击穿第三方信息屏障
  • 智能座舱指数首发!入榜「TOP10自主品牌OEM」都有谁
  • STM32F103移植FreeRTOS必须搞明白的系列知识---3(堆栈)
  • poi数据获取、学校poi分布、医院poi分布、公园分布、地铁分布、道路网
  • 【微服务】一篇文章带你打开微服务大门
  • 今年快30岁的我,还是选择了裸辞···
  • 数据导入与预处理-第6章-01数据清理
  • Nginx配置之https
  • 使用J-link OB工具需要注意的问题
  • Qt5开发从入门到精通——第十篇四节(Qt5 网络与通信—— 网页浏览器与文件下载)
  • Kubernetes 原理剖析与实战08 配置管理:Kubernete 管理业务配置方式有哪些?
  • 调用百度云语音转文本
  • 微信版大语言模型来了:跨时空对话李白、教你高情商说话,API在线试玩全都有...
  • Mybatis架构,SqlSessionFactory源码分析
  • Java数据结构与算法 二
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 2018一半小结一波
  • canvas 五子棋游戏
  • HashMap ConcurrentHashMap
  • in typeof instanceof ===这些运算符有什么作用
  • jdbc就是这么简单
  • JS 面试题总结
  • Laravel 菜鸟晋级之路
  • Nacos系列:Nacos的Java SDK使用
  • nodejs调试方法
  • orm2 中文文档 3.1 模型属性
  • Python socket服务器端、客户端传送信息
  • Vue.js-Day01
  • vue的全局变量和全局拦截请求器
  • 仿天猫超市收藏抛物线动画工具库
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 爬虫模拟登陆 SegmentFault
  • 前端性能优化——回流与重绘
  • 强力优化Rancher k8s中国区的使用体验
  • 使用Gradle第一次构建Java程序
  • 一个SAP顾问在美国的这些年
  • 正则表达式小结
  • 主流的CSS水平和垂直居中技术大全
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #AngularJS#$sce.trustAsResourceUrl
  • #Lua:Lua调用C++生成的DLL库
  • $(selector).each()和$.each()的区别
  • (27)4.8 习题课
  • (3)选择元素——(17)练习(Exercises)
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (过滤器)Filter和(监听器)listener
  • (六)激光线扫描-三维重建
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (数据结构)顺序表的定义
  • (算法)前K大的和
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (原創) 物件導向與老子思想 (OO)