剑指offer题解合集——Week2day4

本文介绍了剑指Offer中两个问题的解决方案:利用快速幂算法在O(1)时间内计算数值的整数次方,以及在链表中O(1)时间删除指定节点。通过模拟二进制表示理解快速幂的方法,以及链表操作的技巧简化了问题解决过程。
摘要由CSDN通过智能技术生成

剑指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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值