当前位置: 首页 > news >正文

备战秋招60天算法挑战,Day24

题目链接: https://leetcode.cn/problems/sum-of-two-integers/

视频题解: https://www.bilibili.com/video/BV1RZ421K7YF/

LeetCode 371.两整数之和

题目描述

给你两个整数 ab ,不使用 运算符 +- ​​​​​​​,计算并返回两整数之和。

举个例子:

输入:a = 1, b = 2
输出:3

视频题解

两整数之和

思路来源

思路来源

知识回顾

  1. &)运算的规则
1 & 1 = 1 
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0 

两位同时为1,结果才为1

  1. |)运算的规则
1 | 1 = 1 
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0 

有一位为1,结果就为1

  1. 异或^)运算的规则
1 ^ 1 = 0 
1 ^ 0 = 1
0 ^ 1 = 1
0 ^ 0 = 0 

两位不同,结果才为1

  1. 左移运算符 <<,可以将一个对象的二进制向左移n位,左边n位丢弃,右边n位补0。比如,a = 1101
a << 2 = 0100
  1. 右移运算符 >>,可以将一个对象的二进制向右移n位,右边n位丢弃,左边n位补0。比如,a = 1101
a >> 2 = 0011

思路解析

正常的十进制加法是加数和被加数每一位相加然后加上上一位的进位数,大于10就继续进位。 题目要求不使用加法运算符,所以我们只能通过异或^)、&)、左移<<)等位运算来实现。

加数和被加数对应的二进制按位相加,1 + 1对应位变成01 + 0对应位变成10 + 0对应位变成0,这个可以通过异或^)运算来实现。

那么还有进位怎么处理呢?

继续观察会发现加数和被加数对应的二进制按位相加,只有1 + 1会存在进位1,可以通过&)和左移<<)运算来实现。

根据上述规律,对于ab两个整数,我们可以得到算法如下:

  1. temp_add = a ^ b,获取到每一位的和(不包含进位),进入步骤2
  2. temp_carry = (a & b) << 1,获取到每一位的进位,进入步骤3
  3. 如果进位temp_carry0,最终结果就是temp_add。如果进位temp_carry不为0a = temp_addb = temp_carry,进入步骤1

C++代码

class Solution {
public:int getSum(int a, int b) {while (b) {int temp_add = a ^ b; //不包含进位a、b每位的和//a、b每位和的进位,左移有符号值会溢出,赋给无符号的会自动取模unsigned int temp_carry = (unsigned int)(a & b) << 1; a = temp_add; //a、b每位的和赋值给ab = temp_carry; //a、b每位的进位赋值给b}return a;}
};

java代码

class Solution {public int getSum(int a, int b) {while (b != 0) {int temp_add = a ^ b; // 不包含进位a、b每位的和// a、b每位和的进位,左移有符号值会溢出,赋给无符号的会自动取模int temp_carry = (a & b) << 1;a = temp_add; // a、b每位的和赋值给ab = temp_carry; // a、b每位的进位赋值给b}return a;}
}

python代码

class Solution:def getSum(self, a: int, b: int) -> int:while b:temp_add = a ^ b  # 不包含进位a、b每位的和# a、b每位和的进位,左移有符号值会溢出,赋给无符号的会自动取模temp_carry = (a & b) << 1a = temp_add  # a、b每位的和赋值给ab = temp_carry  # a、b每位的进位赋值给breturn a

复杂度分析

时间复杂度: O(1),因为整数在32位操作系统上占32位,最多计算32temp_carry,故为常数的时间复杂度。

空间复杂度: 只使用了几个整型变量,故空间复杂度为O(1)


http://www.mrgr.cn/news/9853.html

相关文章:

  • 开放式耳机危害大吗?6点如何挑选合适的开放式耳机!
  • 嵌入式面经篇十——驱动开发
  • 【hot100篇-python刷题记录】【搜索二维矩阵】
  • [JAVA]什么是泛型?泛型在Java中的应用
  • C#算法之二分查找
  • python实现简单中文词元化、词典构造、时序数据集封装等
  • 【Linux】第十六章 高级IO (五种IO模型+fcntl)
  • 什么是ElasticSearch的深度分页问题?如何解决?
  • NRK3301语音识别芯片在汽车内饰氛围灯上的应用方案解析
  • Vue3 获取农历(阴历)日期,并封装日历展示组件
  • 泰国中小企业局局长率考察团到访深兰科技
  • SpringBoot天猫商城基于前后端分离+SpringBoot+BootStrap、Vue.js、JQuery+JPA+Redis
  • Node.js 安装教程
  • C语言:动态内存管理
  • 【数学建模】层次分析法
  • 神经网络算法 - 一文搞懂回归和分类
  • 献给正在挣扎中的技术人!
  • C语言:科目二【基础知识】
  • MATLAB 沿任意方向分层点云(82)
  • 【STM32】电容触摸按键