文章目录
- 剑指offerWeek2
- 周四:数值的整数次方
- AC代码
- 思路:
- 部分模拟
- 周四:在O(1)时间删除链表结点
- AC代码
- 思路:
- 部分模拟
剑指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