剑指offer--位运算、代码的完整性

本文探讨了两个经典算法问题:计算整数二进制表示中1的个数,及计算浮点数的整数次方。通过详细解析,提供了高效的解决方案。适用于算法初学者及面试准备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开宗明义:本系列基于牛客网剑指offer,刷题小白,一天两道我快乐!旨在理解和交流,重在记录,望各位大牛指点!


牛客网-剑指offer



1、二进制中1的个数

描述输入一个整数,输出该数二进制表示中1的个数,其中负数用补码表示

思路这是一个网友的思路,bingo,棒!

  1. 如果一个整数不为0,那么这个整数的二进制里面肯定至少有一位为1
  2. 如果我们把这个数减去1,那么原来处于整数最右边的1就会变为0,最右边的1后面的所有0都会变为1(最右边的1后面还有0)。其他所有位不会受到影响
  3. 下面举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1之后,第三位变为0,它后面两位变为1。而该位之前的那位保持不变,因此结果为1011
  4. 我们可以看出:减一的结果就是把最右边的一个1开始往后的所有位都取反
  5. 这时候将原来的整数和减去1之后的结果做与运算,会把该整数最右边一个1变成0。那么一个二进制有多少个1,就可以进行多少次这样的操作

测试代码:

class Solution {
public:
     int  NumberOf1(int n) {
        int count = 0;

		while (n!=0){
			count++;
			n = n&(n - 1);
		}
		return count;
	}
};

2、数值的整数次方

描述给定一个 d o u b l e double double 类型的浮点数 b a s e base base i n t int int 类型的整数 e x p o n e n t exponent exponent。求 b a s e base base e x p o n e n t exponent exponent 次方

思路这道题考察了指数,列出所有情况

  1. 其中, e x p o n e n t exponent exponent 有正有负,分开考虑
  2. b a s e = 0 , e x p o n e n t > 0 base=0,exponent>0 base=0exponent>0,那么 r e s u l t result result =0;
  3. b a s e ! = 0 , e x p o n e n t > 0 base!=0,exponent>0 base!=0exponent>0,那么 r e s u l t result result =乘方;
  4. b a s e ! = 0 , e x p o n e n t &lt; 0 base!=0,exponent&lt;0 base!=0exponent<0,那么 r e s u l t result result =乘方的倒数,即:1/乘方;
  5. b a s e = 0 , e x p o n e n t = 0 base=0,exponent=0 base=0exponent=0,那么 r e s u l t result result =1;
  6. 其中,又分奇数和偶数
    在这里插入图片描述

测试代码:

class Solution {
public:
    double Power(double base, int exponent) {
		int p = abs(exponent);
		double r = 1.0;
		while (p){
            if( p & 1 )    //奇数
			    r = r*base;
			base = base*base;
			p = p >> 1;    //p>>=1;偶数
		}
		return (exponent > 0) ? r : 1 / r;
	}
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值