淼淼刷力扣

引言

本人初次尝试写博客,希望各位看官大佬多多包容
有错误希望巨巨们提出来,我一定会及时改正,谢谢大家
在自己最好的年纪,找到了未来的目标
还有1年奋斗刷题,明年去面试实习,加油!
博主最近要参加竞赛,所以暂时调整训练计划。

题目一要求:

在这里插入图片描述

整体思路:

切记:不可以每算一个数,就从头加到目标!
思路很简单,每一个新的值都是之前的结果加上本位置的值。

具体代码(内附注释)

class Solution {
public:
	vector<int> runningSum(vector<int>& nums) {
		for (int i = 1; i < nums.size(); i++) {
			nums[i] = nums[i - 1] + nums[i];
		}
		return nums;
	}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):

在这里插入图片描述

题目二要求

汉明距离广泛应用于多个领域。在编码理论中用于错误检测,在信息论中量化字符串之间的差异。

两个整数之间的汉明距离是对应位置上数字不同的位数。
在这里插入图片描述

必备知识

体现两个二进制数的差别位,就用异或操作!
我们统计不一样的总共几位,,一样的置零,不一样的置一,这是异或操作。异或结束之后我们统计1的个数就完了,1的个数就代表了多少位差异。

解法一:暴力破解

完全就是一位一位算二进制位,然后进行比较
最最傻瓜的算法

class Solution {
public:
	int hammingDistance(int x, int y) {
		int nums = 0;
		while (x != 0 || y != 0) {//x,y 全都为零,即可退出
			int one = x % 2;
			int two = y % 2;//取当前位
			x >>= 1;
			y >>= 1;
			if (one != two) {
				nums++;
			}
		}
		return nums;
	}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):

在这里插入图片描述

调用系统库函数

1、c++/c __builtin_popcount(x) 前提:必须是g++编译器,因为这个是g++自带函数。
2、JAVA Integer.bitCount(x)
3、Golong bits.OnesCount(uint(x))

class Solution {//使用内置函数
public:
	int hammingDistance(int x, int y) {
		//我们统计不一样的总共几位,,一样的置零,不一样的置一,这是异或操作
		//异或结束之后我们统计1的个数就完了,1代表的是不同的位数,用内置函数
		return __builtin_popcount(x^y);
	}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):

在这里插入图片描述
时间复杂度:O(1)。不同语言的实现方法不一,我们可以近似认为其时间复杂度为 O(1)。

统计异或操作后1的个数

根据前序知识可知,仅仅统计1的个数即可。
第一:我每次统计过后,不希望他在影响我,所以右移1位,干掉他
第二:我看他末尾是零,则不是目标,是一,就是目标,所以按位与1(十进制),只保留最后一位原来的样子

class Solution {//尤其是这种二进制操作的问题,一定一定要尽量采用移位操作
public:
	//异或操作,就是突出两个二进制数差异的操作,有差异为一,反之为零
	int hammingDistance(int x, int y) {
		int z = x ^ y, num = 0;
		while (z) {
			//我们每次都只需要看z的最后一位是不是一就行,所以在二进制操作中,只保留最后一位,所以按位与1
			num += z & 1;
			//因为每次是除,所以右移
			z >>= 1;
		}
        return num;
	}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):

在这里插入图片描述

时间复杂度:O(logC),其中 CC 是元素的数据范围,在本题中 log C=log 2^{31} = 31

方法三的优化

利用算法:记 f(x 表示 xx 和 x-1x−1 进行与运算所得的结果(即 f(x)=x&(x-1)),那么 f(x)恰为 x 删去其二进制表示中最右侧的 1 的结果。所以就只需要重复执行上述操作直到目标到0为止,统计做了多少次就行,优化之处在于不用管两个相邻的“1”之间的零,直接可以跨过去,几个1 ,循环几次。

class Solution {//尤其是这种二进制操作的问题,一定一定要尽量采用移位操作
public:
	int hammingDistance(int x, int y) {
		//第一步取异或不变,突出差异处
		int z = x ^ y, num = 0;
		while (z) {
			z &= z - 1;
			num++;
		}
		return num;
	}
};

(所有代码均已在力扣上运行无误)

经测试,该代码运行情况是(经过多次测试所得最短时间):
在这里插入图片描述
时间复杂度:O(logC),其中 CC 是元素的数据范围,在本题中 log C=log 2^{31} = 31

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JLU_LYM

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值