秋招 - 剑指offer + Hot 100 - Day2 | 剑指offer16.数值的整数次方、剑指offer17.打印从1到最大的n位数、剑指offer18.删除链表的节点

剑指offer16.数值的整数次方

题目链接:LCR 134. Pow(x, n)

题目描述:实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,x^n)。

class Solution {
    public double myPow(double x, int n) {
        // 1.最简单的for循环 没意义

        // 2.快速幂的思想:比如求x^8 只需要求3次
        // n是整数 但是符号不确定 可能是负数 可能是正数 也可能是0
        // 当然如果x是0没有意义
        if (x == 0.0f)
            return 0.0d;
        double res = 1.0;

        // 2.1 n是负数的情况
        // 负数的最小值 转变为整数的情况下Int是保存不了的
        long N = n;
        if (n < 0) {
            // 次幂取反 再求倒数
            x = 1 / x;
            N = -N;
        }
        // 2.2 n=0
        if (N == 0) {
            return 1.0;
        }

        // 2.3 n是正数的情况
        // 可以把n拆成二进制 比如n=10 二进制 1010 对应 res = (1 * x^8) * (0 * x^4) * (1 * x^2) * (0 * x^1)
        // 所以我们就可以这样求解:判断N二进制最后一位是否为1 如果为1 则 res = res * x^i
        while (N > 0) {
            if ((N & 1) == 1) {
                res = res * x;
            }
            x = x * x;
            N = N >> 1;
        }
        return res;
    }
}

剑指offer17.打印从1到最大的n位数

题目链接:LCR 135. 报数

题目描述:实现一个十进制数字报数程序,请按照数字从小到大的顺序返回一个整数数列,该数列从数字 1 开始,到最大的正整数 cnt 位数字结束。

class Solution {
    public int[] countNumbers(int cnt) {
        // 从返回值数组类型int[]可以看出不用考虑大数问题
        int sum = (int) Math.pow(10, cnt);
        int[] res = new int[sum - 1];
        for (int i = 1; i <= sum - 1; i++) {
            res[i - 1] = i;
        }
        return res;
        // 考虑大数问题就涉及全排列
    }
}

剑指offer18.删除链表的节点

题目链接:LCR 136. 删除链表的节点

题目描述:给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。

class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        if (head == null) {
            return null;
        }
        // 如果删除的是头节点
        if (val == head.val) {
            return head.next;
        }
        // 遍历找到要删除的节点
        ListNode temp = head.next;
        ListNode pre = head;
        while (temp != null) {
            // 如果找到了要删除的节点 将前一个节点的next指向要删除节点的next
            if (temp.val == val) {
                pre.next = temp.next;
                return head;
            }
            // 如果没有找到向后继续遍历
            pre = temp;
            temp = temp.next;
        }
        return head;
    }
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值