经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
【算法】LeetCode算法题-Reverse Integer
来源:cnblogs  作者:小川94  时间:2018/10/16 9:45:14  对本文有异议

这是悦乐书的第143次更新,第145篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第2题(顺位题号是7),给定32位有符号整数,然后将其反转输出。例如:

输入: 123
输出: 321

输入: -123
输出: -321

输入: 120
输出: 21

给定反转整数范围: [?2^31, 2^31 ? 1],即在int的最小值、最大值之间,如果反转整数超过此范围,则返回0。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 分析题目

首先,特许情况是输入值为0,可以直接输出0。
第二步,因为会后负数出现,先判断是否为负数,留下标记,因为处理数据的过程中,操作正数方便于操作负数,这里利用Math.abs()函数取绝对值。
第三步,反转数据。例如: 1223 取反为 3221

最后一位数 = 1223%10 = 3
倒数第二位数 = 122%10 = 2, 其中122是1223除以10后的数
倒数第三位数 = 12%10 = 2, 其中12是122除以10后的数
倒数第四位数 = 1%10 = 1, 其中1是12除以10后的数
拿到反转的数 31000 + 2100 + 210 + 1 = 3221

可以进一步分析反转的数是怎么来的:

0x10 + 3 = 3
3x10 + 2 = 32
32x10 + 2 = 322
322x10 + 1 = 3221
反转的数是原数对10取余的余数从个十百位依次向前移动 加上 新的余数

第四步,判断是否超出范围,是则返回0,否则判断符号标记,还原符号。对于还原符号的操作,可以直接加上“-”号,也可以用0减反转后的数,也可以利用Math.negateExact()函数。

  1. public int reverse(int x) {
  2. int result = 0;
  3. if (0 == x) {
  4. return 0;
  5. }
  6. boolean flag = false;
  7. if (x < 0) {
  8. flag = true;
  9. }
  10. int tem = Math.abs(x);
  11. long afterreverse = 0;
  12. while (tem > 0) {
  13. afterreverse = afterreverse*10 + tem%10;
  14. tem /= 10;
  15. }
  16. if (flag) {
  17. afterreverse = 0 - afterreverse;
  18. }
  19. if (afterreverse > Integer.MAX_VALUE || afterreverse < Integer.MIN_VALUE) {
  20. result = 0;
  21. } else {
  22. result = (int)afterreverse;
  23. }
  24. return result;
  25. }

03 取巧的解法

将其转为字符串,利用StringBuilder类的reverse()方法,省去循环处理整数的步骤。

  1. public int reverse2(int x) {
  2. if (0 == x) {
  3. return 0;
  4. }
  5. String flag = "";
  6. if (x < 0) {
  7. flag = "-";
  8. }
  9. String str = String.valueOf(Math.abs(x));
  10. StringBuilder sb = new StringBuilder(str);
  11. String afterreverse = sb.reverse().toString();
  12. if (afterreverse.length() >10) {
  13. return 0;
  14. }
  15. long x_reverse = Long.parseLong(flag+afterreverse);
  16. if (x_reverse > Integer.MAX_VALUE || x_reverse < Integer.MIN_VALUE) {
  17. x_reverse = 0;
  18. }
  19. return (int)x_reverse;
  20. }

04 小结

本题需要注意的是符号和反转后是否会溢出的情况,其次尾数是0的情况,在两种解法中都涵盖进去了,不需要额外考虑。
如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

本文首发于我的个人公众号:悦乐书,转载请注明出处!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号