Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229627
  • 博文数量: 41
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 407
  • 用 户 组: 普通用户
  • 注册时间: 2013-06-27 13:42
文章分类

全部博文(41)

文章存档

2016年(1)

2015年(18)

2014年(22)

我的朋友

分类: Java

2015-02-16 20:45:44



-- Pow(x, n) 
    >> 题目:实现x的n次方
    >> 解题思路:n个x相乘,如果是n个相乘那么复杂度为O(N),如果n比较大,可以两两相乘,分治。时间复杂度logn
        ++ 功能:n为正数 0 负数
        ++ 边界:
        ++ 负面:n为负数,x为0

点击(此处)折叠或打开

  1.     public double pow(double x, int n) {
  2.         if (x == 0.0) return x; // 底为0的特殊处理
  3.         int newN = n > 0 ? n : (-1 * n); // 负数处理
  4.         double result = 1.0;
  5.         if (newN > 0) {
  6.             // 分治
  7.             if ((newN & 0x1) == 1) {//位运算代替取余操作
  8.                 result = pow(x, (newN - 1) / 2);
  9.                 result *= result;
  10.                 result *= x;
  11.             } else {
  12.                 result = pow(x, newN / 2);
  13.                 result *= result;
  14.             }
  15.         }
  16.         if (n < 0) {
  17.             result = 1.0 / result;
  18.         }
  19.         return result;
  20.     }


-- 打印1到最大的n位数
    >> 题目:如题
    >> 解题思路:n位数,n的范围未知,也就说可能很大,所以最简单的使用数组模拟数。进行递归或者循环。


-- Reverse Integer 
    >> 题目:Reverse Integer , 123 -> 321   -123 -> -321
    >> 解题思路:关注溢出问题,尾部的长尾0问题,但是通过扩大范围可以解决

点击(此处)折叠或打开

  1.     public int reverse(long x) {
  2.         long newX = x > 0 ? x : (-1 * x);
  3.         long result = 0, temp = newX;
  4.         while (temp != 0) {
  5.             result = result * 10 + temp % 10;
  6.             temp = temp / 10;
  7.         }
  8.         if (result > Integer.MAX_VALUE) {
  9.             result = 0;
  10.         }
  11.         if (x < 0) {
  12.             result = -1 * result;
  13.         }
  14.         
  15.         return (int)result;
  16.     }
-- Sqrt(x) 
    >> 题目:Sqrt(x) ,对于不能整出的需要去掉小数,最后的end刚好是这个数
    >> 解题思路:较简单的就是二分查找。

点击(此处)折叠或打开

  1.     public int sqrt(int x) {
  2.         if (x == 1 || x == 0) return x;
  3.         int start = 0, end = x / 2 + 1, mid = 0;
  4.         for ( ; start <= end; ) {
  5.             mid = start + (end - start) / 2; // 防止溢出
  6.             if (mid < x / mid) { // 防止溢出
  7.                 start = mid + 1;
  8.             } else if (mid > x / mid){
  9.                 end = mid - 1;
  10.             } else {
  11.                 return mid;
  12.             }
  13.         }
  14.         return end;
  15.     }


阅读(1860) | 评论(0) | 转发(0) |
0

上一篇:Array例题分析(2)

下一篇:发散思维

给主人留下些什么吧!~~