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

LeetCode算法题-Sum of Two Integers(Java实现)

这是悦乐书的第210次更新,第222篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第78题(顺位题号是371)。计算两个整数a和b的总和,但不允许使用运算符+和 - 。例如:

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

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

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

借助循环来实现。先将a赋值给临时变量sum,然后判断b的正负,如果b大于0,sum就自加加,同时b自减减;反之如果b小于0,则sum就自减减,b就自加加,最后返回sum即可。

public int getSum(int a, int b) {
    if (a == 0) {
        return b;
    }
    if (b == 0) {
        return a;
    }
    int sum = a;
    if (b > 0) {
        while (b > 0) {
            sum++;
            b--;
        }
    } else {
        while (b < 0) {
            sum--;
            b++;
        }
    }
    return sum;
}


03 第二种解法

因为题目说不许用加减运算符,所以我们需要考虑使用位运算。在做加法运算时,会产生进位的情况。先来看一个53+69例子:

  • 如果不考虑进位做加法,可以得到12。

  • 如果考虑进位做加法,可以得到110。

这时我们把两数12和110加起来,就是53和69的和,122。

如果把这种考虑位、不考虑位的计算方式换成二进制数,那么:

  • 如果不考虑进位做加法,0+0=0,1+0=1,0+1=1,1+1=0。这其实就是异或(^)运算,对应位不同时,取1,否则取0。

  • 如果考虑进位做加法,0+0=0,1+0=0,0+1=0,1+1=1。这其实就是与(&)运算,相同位均为1才是1。

首先,我们可以使用a和b之间的与(&)运算来查找进位。其次,我们可以在a和b之间使用异或(^)运算来查找不同的位,并将其赋值给a,然后,我们将进位向左移动一个位置并将其赋值给b,直到没有进位或b为0。最后返回a即可。

public int getSum2(int a, int b) {
    if (a == 0) {
        return b;
    }
    if (b == 0) {
        return a;
    }
    while (b != 0) {
        int carry = a&b;
        a = a^b;
        b = carry << 1;
    }
    return a;
}


04 第三种解法

我们可以将第二种解法变成递归的写法。

public int getSum3(int a, int b) {
    if (b == 0) {
        return a;
    }
    return getSum3(a ^ b, (a&b) << 1);
}


05 小结

算法专题目前已连续日更超过两个月,算法题文章78+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

转载于:https://www.cnblogs.com/xiaochuan94/p/10163368.html

相关文章:

  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗?
  • 对于Ping的过程,你真的了解吗?
  • 05.java多线程问题
  • java8 -函数式编程之四个基本接口
  • 简单介绍接口自动化测试----数据驱动测试ddt
  • 云计算的拐点隐现 华为云开源两款容器技术
  • 记一份电网信息化建设企业信息分析平台规划
  • 如何快速批量建网站?
  • python3元类深入解读
  • 使用podspec创建iOS插件
  • Spring boot 添加日志 和 生成接口文档
  • 生成器13
  • 一个快速检测系统CPU负载的小程序
  • ionic错误
  • java类什么时候加载?,加载类的原理机制是怎么样的?
  • (三)从jvm层面了解线程的启动和停止
  • [case10]使用RSQL实现端到端的动态查询
  • [译] React v16.8: 含有Hooks的版本
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Docker容器管理
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • extjs4学习之配置
  • Git的一些常用操作
  • Java 内存分配及垃圾回收机制初探
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • 彻底搞懂浏览器Event-loop
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 06-01 点餐小程序前台界面搭建
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (SpringBoot)第二章:Spring创建和使用
  • (二)正点原子I.MX6ULL u-boot移植
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (三)mysql_MYSQL(三)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (实战篇)如何缓存数据
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)甲方乙方——赵民谈找工作
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net专家(张羿专栏)
  • .vimrc php,修改home目录下的.vimrc文件,vim配置php高亮显示
  • :not(:first-child)和:not(:last-child)的用法
  • @staticmethod和@classmethod的作用与区别
  • @软考考生,这份软考高分攻略你须知道
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [BZOJ4337][BJOI2015]树的同构(树的最小表示法)
  • [C#7] 1.Tuples(元组)
  • [c]统计数字
  • [CF494C]Helping People
  • [Design Pattern] 工厂方法模式
  • [Java安全入门]三.CC1链