Saturday, June 22, 2013

pow(x,n)@leetcode

刷题必备书籍Cracking the Coding Interview: 150 Programming Questions and Solutions 

简历:The Google Resume: How to Prepare for a Career and Land a Job at Apple, Microsoft, Google, or any Top Tech Company
算法学习书籍:Introduction to Algorithms
编程珠玑:Programming Pearls (2nd Edition)
C++ 学习:The C++ Programming Language, 4th Edition
经典操作系统书籍,龙书:Operating System Concepts
创业:The Start-up of You: Adapt to the Future, Invest in Yourself, and Transform Your Career
Implement pow(xn).
» Solve this problem

最直白的就是一个一个相乘,但是这样的话,会超时,如果n非常大的话。所以我们想到用指数递减地方式相乘,时间就是O(logn), 不然就是O(n).

还得考虑结果的正负,还有n<0的情况。


My code.
代码更新。
不是很懂为什么那个m那一步要是unsigned m = abs((double)n) 不然就会超时,求解答

3 comments:

  1. This comment has been removed by the author.

    ReplyDelete
  2. 关于你说的:
    不是很懂为什么那个m那一步要是unsigned m = abs((double)n) 不然就会超时,求解答

    因为pow(1., -2147483648) 这个case的 -2147483648 即为INT_MIN。它的二进制是
    0x80000000 = 10000000 00000000 00000000 00000000

    而且负数的right shift会在左边添bit 1而非0,所以你的for循环判断条件始终为非0,死循环了。

    ReplyDelete
  3. for(; m && m != -1; x*=x, m>>=1)

    ReplyDelete

Leetcode 316. Remove Duplicate Letters

 这道题表面问的是如何删除重复,实际在问如何从多个字符选取一个保留,从而让整个字符串按升序排列。那么策略就是对于高顺位的字符比如‘a',就要选靠前位置的保留,而低顺位字符如’z'则应该尽量选取靠后位置保留。 算法大概思路:每看到一个字符,我们要决定是否保留 1. ...