剑指offerWeek2
周四:数值的整数次方
题目链接:数值的整数次方
实现函数double Power(double base, int exponent),求base的 exponent次方。
不得使用库函数,同时不需要考虑大数问题。
只要输出结果与答案的绝对误差不超过 10−2
即视为正确。
注意:
不会出现底数和指数同为0的情况
当底数为0时,指数一定为正
底数的绝对值不超过 10
,指数的取值范围 [−231,231−1]
样例1
输入:10 ,2
输出:100
样例2
输入:10 ,-2
输出:0.01
AC代码
class Solution {
public:
double Power(double x, int n) {
long double res = 1;
for (auto k = abs((long long)n); k; k >>= 1)
{
if (k & 1) res *= x;
x *= x;
}
if (n < 0) res = 1 / res;
return res;
}
};
思路:
整体思路
无脑思路:
直接循环,然后乘积即可
快速幂:
记底数为x
先预处理出x的(2的0次方), x的(2的1次方), x的(2的2次方)……x的(2的logk次方)
然后使得等式等式
x的(2的k1次幂) * x的(2的k2次幂) * x的(2的k3次幂) …… x的(2的kn次幂)乘积 = base的exponent次方
即:
(重点)2的k1次幂 + 2的k2次幂 + 2的k3次幂 + …… + 2的kn次幂 = base的exponent次方
那么整个题目的本质其实就是求得幂的二进制表示
例如:
求2的3次方
3的二进制:0011
那么有
2的(2的0次方) * 2的(2的1次方) = 2的1次方 * 2的平方 = 2 * 4 = 8
那么现在的小问题就是:如何预处理?
其实很简单,只需要反复平方即可
已知:x的(2的0次方) = x的1次方 = x
那么:x的(2的1次方) = x的2次方 = x^2
那么:x的(2的2次方) = x的4次方 = (x^2)^2
. .
. .
. .
可以得出,反复平方即可
部分模拟
例如:
求2的3次方
3的二进制:0011
那么有
2的(2的0次方) * 2的(2的1次方) = 2的1次方 * 2的平方 = 2 * 4 = 8
周四:在O(1)时间删除链表结点
题目链接:在O(1)时间删除链表结点
给定单向链表的一个节点指针,定义一个函数在O(1)时间删除该结点。
假设链表一定存在,并且该节点一定不是尾节点。
数据范围
链表长度 [1,500]
样例
输入:链表 1->4->6->8
删掉节点:第2个节点即6(头节点为第0个节点)
输出:新链表 1->4->8
AC代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
void deleteNode(ListNode* node) {
auto ne = node->next;
*node = *(node->next);
delete ne;
}
};
思路:
整体思路
使得删除节点的数值为下一个节点的数值
然后删除下一个节点
部分模拟
输入:链表 1->4->6->8
删掉节点:第2个节点即6(头节点为第0个节点)
使得第二个节点的数值为下一个节点的数值:1->4->8->8
然后删除下一个节点:1->4->8