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