乱序版 ● 剑指offer每日算法题打卡题解——位运算 (题号15,16,65)
Posted 寂静花开
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了乱序版 ● 剑指offer每日算法题打卡题解——位运算 (题号15,16,65)相关的知识,希望对你有一定的参考价值。
打卡day15
第一题:剑指 Offer 16. 数值的整数次方
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。
示例 1:
输入:x = 2.00000, n = 10
输出:1024.00000
示例 2:
输入:x = 2.10000, n = 3
输出:9.26100
示例 3:
输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25
提示:
-100.0 < x < 100.0
-231 <= n <= 231-1
-104 <= xn <= 104
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof
解题思路:
将 n 个 x 相乘分解为 n / 2 个 x 相乘,如果 n 为奇数,要多乘一次 x。
要注意,n为负数的时候。
java代码:
class Solution {
public double myPow(double x, int n) {
if (n == 0) {
return 1;
}
else if (n == 1) {
return x;
}
else if (n < 0) {
return 1 / (x * myPow(x, -(n+1)));
}
else {
double res = myPow(x, n / 2);
return res * res * myPow(x, n % 2);
}
}
}
第二题:剑指 Offer 15. 二进制中1的个数
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。
提示:
- 请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
- 在 Java 中,编译器使用 二进制补码 记法来表示有符号整数。因此,在上面的 示例 3 中,输入表示有符号整数 -3。
示例 1:
输入:n = 11 (控制台输入 00000000000000000000000000001011)
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。
示例 2:
输入:n = 128 (控制台输入 00000000000000000000000010000000)
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 ‘1’。
示例 3:
输入:n = 4294967293 (控制台输入 11111111111111111111111111111101,部分语言中 n = -3)
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。
提示:
输入必须是长度为 32 的 二进制串 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-jin-zhi-zhong-1de-ge-shu-lcof
解题思路:
根据 与运算 定义,设二进制数字 n ,则有:
若 n & 1 = 0 ,则 n 二进制 最右一位 为 0 ;
若 n & 1 = 1,则 nn 二进制 最右一位 为 1 。
java代码:
public class Solution {
public int hammingWeight(int n) {
int res = 0;
while(n != 0) {
res += n & 1;
n >>>= 1;
}
return res;
}
}
第三题:剑指 Offer 65. 不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。
示例:
输入: a = 1, b = 1
输出: 2
提示:
a, b 均可能是负数或 0
结果不会溢出 32 位整数
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bu-yong-jia-jian-cheng-chu-zuo-jia-fa-lcof
解题思路:
在计算机系统中,数值一律用 补码 来表示和存储。补码的优势: 加法、减法可以统一处理(CPU只有加法器)。因此,以上方法 同时适用于正数和负数的加法 。
java代码:
class Solution {
public int add(int a, int b) {
while(b != 0) { // 当进位为 0 时跳出
int c = (a & b) << 1; // c = 进位
a ^= b; // a = 非进位和
b = c; // b = 进位
}
return a;
}
}
以上是关于乱序版 ● 剑指offer每日算法题打卡题解——位运算 (题号15,16,65)的主要内容,如果未能解决你的问题,请参考以下文章
乱序版 ● 剑指offer每日算法题打卡题解——分治算法(题号17,14)
乱序版 ● 剑指offer每日算法题打卡题解—— 栈 (题号9,6,30)
乱序版 ● 剑指offer每日算法题打卡题解—— 分治算法(题号7,33,64)
乱序版 ● 剑指offer每日算法题打卡题解—— 查找算法 (题号3,4,11,53)