剑指 Offer 16. 数值的整数次方

难度中等114
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
image.png

  • x^n = x^(n/2) * x^(n/2) 如果n奇数再乘一个x
  • 判断基数为0的情况

    • x=0,n<0,return 1/myPowUnsigned(x,-n);会有除零错误

      1. class Solution {
      2. public double myPow(double x, int n) {
      3. if(x==0)
      4. return 1;
      5. if(n==0)
      6. return 1;
      7. if(n==1)
      8. return x;
      9. if(n>0) {
      10. return myPowUnsigned(x,n);
      11. } else {
      12. return 1/myPowUnsigned(x,-n);
      13. }
      14. }
      15. public double myPowUnsigned(double x,int n) {
      16. if(n==0)
      17. return 1;
      18. if(n==1)
      19. return x;
      20. double res = myPowUnsigned(x,n/2);
      21. res = res * res;
      22. if((n&1)==1) {
      23. res = res * x;
      24. }
      25. return res;
      26. }
      27. }

7. 整数反转

  • 判断溢出的方法值得学习

image.png

  1. class Solution {
  2. public int reverse(int x) {
  3. while(x!=0 && x%10==0) {
  4. x = x/10;
  5. }
  6. int r = 0;
  7. while(x!=0) {
  8. int p = x%10;
  9. x = x/10;
  10. if(r>Integer.MAX_VALUE/10 || (r==Integer.MAX_VALUE && p>7)) return 0;
  11. if(r<Integer.MIN_VALUE/10 || (r==Integer.MIN_VALUE && p<-8)) return 0;
  12. r = r * 10 + p;
  13. }
  14. return r;
  15. }
  16. }