LeetCode07:Reverse Integer

原题目:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
翻转输入的整数

算法分析:

算法1:
将整数转化为字符串,通过翻转字符串来实现数字的翻转。

算法2:
将整数放入字符数组中,通过从尾到头复制数组,来实现字符串的翻转。

算法3:
时间复杂度O(logn),空间复杂度O(1)。考虑:1.负数的情况;2.溢出的情况(正溢出&&负溢出)
                     通过for(; t > 0; t /= 10)
                        r = r*10 + t%10;        来实现数字的翻转,巧妙!



遇到问题及解决方法:
1.替换字符串中的指定字符: String  tmpstring  =  str .replaceAll( "-" "" );             //通过replaceAll("-", "")来替换负号
2.调用reverse()函数来翻转字符串: str  =  stringbuf .reverse().toString();                //翻转字符串
3.将字符串转化为整数: res  = Long.parseLong( str )*(-1);
4.判断数字是否越界: if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE){        //判断是否越界
5.将字符数组转化为字符串: String  tmp  = String. valueOf ( newarr );                             //将字符数组转化为字符串
6.删除末尾字符: String  tmpstring  =  tmp .substring(0,  tmp .length()-1);              //删除末尾字符

错误代码:

 错误原因:没有考虑溢出的情况


LeetCode提交源码:
算法1:
   
   
  1. public int reverse(int x){
  2. String str = x + ""; //通过在数字后加""来实现将整数转化为字符串
  3. long result;
  4. char[] arr = new char[str.length()]; //原字符数组
  5. char[] newarr = new char[str.length()]; //用于存放翻转后的字符
  6. arr = str.toCharArray();
  7. if(x < 0){
  8. for(int j = str.length() - 1,i = 0; j > 0; j--){
  9. newarr[i] = arr[j]; //将原字符数组中的字符从尾到头输出到新字符数组中
  10. i++;
  11. }
  12. String tmp = String.valueOf(newarr); //将字符数组转化为字符串
  13. String tmpstring = tmp.substring(0, tmp.length()-1); //删除末尾字符
  14. // System.out.println("tmpstring=" + tmpstring + "length=" + tmpstring.length());
  15. result = Long.parseLong(tmpstring)*(-1); //将字符串转化为长整型整数
  16. }
  17. else{
  18. for(int i = 0; i < str.length(); i++){
  19. newarr[i] = arr[i];
  20. }
  21. String tmp = String.valueOf(newarr); //将字符数组转化为字符串
  22. System.out.println("tmp=" + tmp);
  23. result = Long.parseLong(tmp);
  24. }
  25. return (int)result;
  26. }
 

算法3:

   
   
  1. public int reverse(int x){
  2. long r = 0;
  3. long t = x;
  4. t = t > 0 ? t : -t; //先将负数也转化为正数
  5. for(; t > 0; t /= 10)
  6. r = r*10 + t%10; //翻转,
  7. boolean sign = x > 0? false:true;
  8. if(r > 2147483647 || (sign && r > Integer.MAX_VALUE)){ //一句话判断了最大值和最小值情况
  9. return 0;
  10. }
  11. else{
  12. if(sign){
  13. return (int)-r; //将long型强制转化为int并返回,因为函数要求返回int
  14. }
  15. else{
  16. return (int)r; //将long型强制转化为int并返回,因为函数要求返回int
  17. }
  18. }
  19. }
 

完整运行程序:
   
   
  1. /**************************************************************
  2. * Copyright (c) 2016
  3. * All rights reserved.
  4. * 版 本 号:v1.0
  5. * 题目描述: Reverse Integer
  6. * Reverse digits of an integer.
  7. * Example1: x = 123, return 321
  8. * Example2: x = -123, return -321
  9. * 翻转指定的数字
  10. * 输入描述:请输入一个整数:
  11. * -123456789
  12. * 程序输出: 算法1翻转后的结果是:
  13. * -987654321
  14. * 算法2翻转后的结果是:
  15. * -987654321
  16. * 算法3翻转后的结果是:
  17. * -987654321
  18. * 问题分析: 1.替换字符串中的指定字符:String tmpstring = str.replaceAll("-", ""); //通过replaceAll("-", "")来替换负号
  19. * 2.调用reverse()函数来翻转字符串:str = stringbuf.reverse().toString(); //翻转字符串
  20. * 3.将字符串转化为整数:res = Long.parseLong(str)*(-1);
  21. * 4.判断数字是否越界:if(res > Integer.MAX_VALUE || res < Integer.MIN_VALUE){ //判断是否越界
  22. * 5.将字符数组转化为字符串:String tmp = String.valueOf(newarr); //将字符数组转化为字符串
  23. *
  24. * 算法描述:算法1:将整数转化为字符串,通过翻转字符串来实现数字的翻转。
  25. * 算法2:将整数放入字符数组中,通过从尾到头复制数组,来实现字符串的翻转。
  26. * 算法3:时间复杂度O(logn),空间复杂度O(1)。考虑:1.负数的情况;2.溢出的情况(正溢出&&负溢出)
  27. * 通过for(; t > 0; t /= 10)
  28. * r = r*10 + t%10; 来实现数字的翻转,巧妙!
  29. * 完成时间:2016-11-15
  30. ***************************************************************/
  31. package org.GuoGuoFighting.LeetCode07;
  32. import java.util.Scanner;
  33. /*算法1:
  34. 将整数转化为字符串,通过翻转字符串来实现数字的翻转。
  35. 要注意数字溢出情况*/
  36. class SolutionMethod1{
  37. public int reverse(int x){
  38. String str = x + ""; //通过在数字后加""来实现将整数转化为字符串
  39. long res;
  40. if(x < 0){ //负数情况,考虑负号
  41. String tmpstring = str.replaceAll("-", ""); //通过replaceAll("-", "")来替换负号
  42. StringBuffer stringbuf = new StringBuffer(tmpstring);
  43. str = stringbuf.reverse().toString(); //翻转字符串
  44. //res = Integer.parseInt(str)*(-1);
  45. res = Long.parseLong(str)*(-1); //将字符串转化为长整型整数
  46. }
  47. else{
  48. StringBuffer stringbuf = new StringBuffer(str);
  49. str = stringbuf.reverse().toString();
  50. // res = Integer.parseInt(str);
  51. res = Long.parseLong(str);
  52. }
  53. if(res > Integer.MAX_VALUE || res < Integer.MIN_VALUE){ //判断是否越界
  54. return 0;
  55. }
  56. return (int)res;
  57. }
  58. }
  59. /*
  60. 算法2.
  61. 将整数放入字符数组中,通过从尾到头复制数组,来实现字符串的翻转。
  62. 要考虑数字溢出的情况
  63. */
  64. class SolutionMethod2{
  65. public int reverse(int x){
  66. String str = x + ""; //通过在数字后加""来实现将整数转化为字符串
  67. long result;
  68. char[] arr = new char[str.length()]; //原字符数组
  69. char[] newarr = new char[str.length()]; //用于存放翻转后的字符
  70. arr = str.toCharArray();
  71. if(x < 0){
  72. for(int j = str.length() - 1,i = 0; j > 0; j--){
  73. newarr[i] = arr[j]; //将原字符数组中的字符从尾到头输出到新字符数组中
  74. i++;
  75. }
  76. String tmp = String.valueOf(newarr); //将字符数组转化为字符串
  77. String tmpstring = tmp.substring(0, tmp.length()-1); //删除末尾字符
  78. // System.out.println("tmpstring=" + tmpstring + "length=" + tmpstring.length());
  79. result = Long.parseLong(tmpstring)*(-1); //将字符串转化为长整型整数
  80. }
  81. else{
  82. for(int i = 0; i < str.length(); i++){
  83. newarr[i] = arr[i];
  84. }
  85. String tmp = String.valueOf(newarr); //将字符数组转化为字符串
  86. System.out.println("tmp=" + tmp);
  87. result = Long.parseLong(tmp);
  88. }
  89. return (int)result;
  90. }
  91. }
  92. /*
  93. 算法3.时间复杂度O(logn),空间复杂度O(1)
  94. 考虑:1.负数的情况;2.溢出的情况(正溢出&&负溢出)*/
  95. class SolutionMethod3{
  96. public int reverse(int x){
  97. long r = 0;
  98. long t = x;
  99. t = t > 0 ? t : -t; //先将负数也转化为正数
  100. for(; t > 0; t /= 10)
  101. r = r*10 + t%10; //翻转,
  102. boolean sign = x > 0? false:true;
  103. if(r > 2147483647 || (sign && r > Integer.MAX_VALUE)){ //一句话判断了最大值和最小值情况
  104. return 0;
  105. }
  106. else{
  107. if(sign){
  108. return (int)-r; //将long型强制转化为int并返回,因为函数要求返回int
  109. }
  110. else{
  111. return (int)r; //将long型强制转化为int并返回,因为函数要求返回int
  112. }
  113. }
  114. }
  115. }
  116. public class ReverseInteger {
  117. public static void main(String[] args){
  118. System.out.println("请输入一个整数:");
  119. Scanner scanner = new Scanner(System.in);
  120. int num = scanner.nextInt();
  121. scanner.close();
  122. SolutionMethod1 solution1 = new SolutionMethod1();
  123. System.out.println("算法1翻转后的结果是:");
  124. System.out.println(solution1.reverse(num));
  125. SolutionMethod2 solution2 = new SolutionMethod2();
  126. System.out.println("算法2翻转后的结果是:");
  127. System.out.println(solution2.reverse(num));
  128. SolutionMethod3 solution3 = new SolutionMethod3();
  129. System.out.println("算法3翻转后的结果是:");
  130. System.out.println(solution3.reverse(num));
  131. }
  132. }


程序运行结果:
 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值