371.两整数之和

1.两整数之和


1,“正常”思路

int getSum(int a, int b){return a + b;
}

2,位运算

预备知识:有符号的整数通常使用补码来表示和存储。补码具有以下特性:

  1. 正整数的补码与原码相同;负整数的补码为其原码除符号位外的所有位取反后+1
  2. 可以将减法运算转换为补码的加法运算来实现
  3. 符号位与数值位可以一起参与运算

异或相当于一次无进位加法。来看一个例子

a ^ b得到了一个无进位加法运算结果,如果要得到 a + b 的结果的最终值,我们还要找到进位的数,把这二者相加

我们可以用操作获得进位

由计算结果可见,0100 并不是我们想要的进位,1 + 1所获得的进位应该放在它的更高位,即在左侧位上,因此我们还要将 0100 左移一位,这才是我们所要的进位结果

总结一下:

  1. a + b 的问题拆分为(a + b 的无进制位结果)( a + b 的进制位结果)
  2. 无进位加法使用异或计算得出
  3. 进位结果使用与运算移位运算得出
  4. 循环此过程,直到进位为 0
int getSum(int a, int b){int c = 0;while(b){c = (unsigned int)(a & b) << 1;a ^= b;b = c;}return a;
}

面试题 17.01. 不用加号的加法 - 力扣(LeetCode) (leetcode-cn.com)

1,正常做法

2,位运算

int Add(int a, int b){int c = 0;while(b){c = (unsigned int)(a & b) << 1;a ^= b;b = c;}return a;
}

思路参考第一题

剑指 Offer 65. 不用加减乘除做加法 - 力扣(LeetCode) (leetcode-cn.com)

此题的解法也类似上面两道题


面试题 08.05. 递归乘法 - 力扣(LeetCode) (leetcode-cn.com)

对于这一题,我们可以采用暴力的方法直接 return a * b

不过,我们也可以按照题目的意思来操作一下下。

int multiply(int A, int B){int result; if (B > 1)result = multiply(A, B - 1) + A;elseresult = A;return result;
}

递归使用乘法函数,相当于b次的a相加

方法二

基本情况:

  1. B = 0 , 结果 == 0
  2. B = 1 , 结果 == A

考虑B为偶数的情况

res = A * ( B / 2) +  A * ( B / 2)

B为奇数时,只要在原本的结果上再加上 A 即可

int multiply(int A, int B){if(B == 0) return 0;if(B == 1) return A;int C = 0;if(B & 1 > 0) //表示B为奇数{C = A;}return multiply(A , B >> 1) + multiply(A , B >> 1) + C;
}

29. 两数相除 - 力扣(LeetCode) (leetcode-cn.com)

题目规定了【只能存储32位整数】,如果我们使用64位整数,可以极大地方地方便我们的代码,但这是违反题目规则的。

如果除法结果溢出,我们需要返回  2(31)- 1

  1. 当除数为32位有符号整数的最小值-2(31) - 1时,如果除数为1,我们直接返回         -2(31)  ||   如果除数为-1,那么答案为 2(31),产生了溢出,我们需要返回的值为2(31) - 1
  2. 当被除数为0时,我们可以直接返回0

于是,年幼的我们选择了

向大佬学习

int divide(int dividend, int divisor){int cnt = 0;int sign = 1;if ((dividend ^ divisor) < 0) { // 两数任意一个为负数sign = -1;}if (divisor == INT_MIN) { // 除数边界值特殊处理if (dividend == INT_MIN) {return 1;} else {return 0;}}if (dividend == INT_MIN) { // 被除数边界值特殊处理if (divisor == -1) {return INT_MAX;} else if (divisor == 1) {return INT_MIN;}dividend += abs(divisor); // 先执行一次加操作,避免abs转换溢出cnt++;} int a = abs(dividend);int b = abs(divisor);while (a >= b) {int c = 1;int s = b;// 需指数级快速逼近,以避免执行超时while (s < (a >> 1)) { // 逼近至一半,同时避免溢出s += s;c += c;}cnt += c;a -= s;}return (sign == -1) ? -cnt : cnt;
}

50. Pow(x, n) - 力扣(LeetCode) (leetcode-cn.com)

我尝试使用了常规的思路如下

double myPow(double x, int n){double sum = 1;int i = 0;if(n == 0)return 1.0;if(n > 0){for(i = 1;i <= n;i++)sum *= x;}if(n < 0){x = 1.0 / x;for(i = 1;i <= -n;i++)sum *= x;}return sum;
}

不过时间复杂度太高,运行超时。后来去学习了大佬的解法如下:

方法一 :递归

double myPow(double x, int n){if (n == 0) return 1;if (n == 1) return x;if (n ==-1) return 1/x;double temp = myPow(x, n / 2);return temp * temp * myPow(x, n % 2);
}

方法二:迭代

double myPow(double x, int n){double res = 1.0;if (n < 0) x = 1/x;while (n) {if (n & 1) res = res * x;   //括号内等同(n % 2)x = x * x;n = n / 2;}return res;
}

方法三:快速幂 

快速幂的本质是分治算法 。

举个例子:

从x开始,直接将上一次的结果进行平方,计算6次就能得到x(64)次方,而不需要对x*63次x

从左到右进行推导看上去比较困难,因为在每一步中,我们不知道在将上一次的结果平方后是否还需要*x。如果我们从右往左看,分治的思想就很明显了。

  1. 当我们要计算 时,我们可以先递归计算出 y =  ,其中[n /2 ]表示对a进行向下取整
  2. 根据递归的结果,如果n为偶数,你们  =  ;如果n为奇数,那么 = * x
  3. 递归的边界为 n = 0,任意数的 0次方 为1
class Solution {
public:double quickMul(double x, long long N) {if (N == 0) {return 1.0;}double y = quickMul(x, N / 2);return N % 2 == 0 ? y * y : y * y * x;}double myPow(double x, int n) {long long N = n;return N >= 0 ? quickMul(x, N) : 1.0 / quickMul(x, -N);}
};

69. Sqrt(x) 题解 - 力扣(LeetCode) (leetcode-cn.com)

(卷不动了)


面试题 16.07. 最大数值 - 力扣(LeetCode) (leetcode-cn.com)

没什么好说的了,三目操作符yyds


今天的LeetCode之旅到此结束,希望能跟英雄哥继续努力学习,不断提高自己!!

[小玄的刷题日记]《LeetCode零基础指南》(第二讲) 函数相关推荐

  1. 【学习报告】LeetCode零基础指南 (第二讲)函数

    ga一,  感觉今天自己水了好多题: 二, 三 ,解题分析与收获 通过做这几道简单的力扣题,我简单了解了力扣的评测,在英雄哥的带领下水了好几道题

  2. 【解题报告】《LeetCode零基础指南》(第三讲) 循环

    ☘前言☘ 今天是九日集训第二天,我会记录一下学习内容和题解,争当课代表0.0. 注意!!!!题解的解法一是今天要掌握的解法,解法2是学有余力再研究,涉及到后面知识点0.0 链接:<LeetCod ...

  3. 《LeetCode零基础指南》(第十一讲) 遇到不会的题怎么办?

    文章目录 零.写在前面 一.认识自我 二.建立信心 三.解题报告 四.旧题二刷 五.沟通交流 六.前置知识 零.写在前面   当看到这篇文章的时候,确保已经参加过 [万人千题] 九日集训,并且加入 [ ...

  4. 《LeetCode零基础指南》导读

    文章目录 一.出该专栏的目的 二.本专栏适宜人群 三.本专栏涉及的知识点 四.本专栏收费模式 五.付费玩家专属福利 六.专栏阅读须知 七.配套赠送福利 一.出该专栏的目的   由于之前的<算法零 ...

  5. 《LeetCode零基础指南》(第三讲) 一维数组

    文章目录 零.了解网站 1.输入输出 2.刷题步骤 3.尝试编码 4.调试提交 一.概念定义 1.顺序存储 2.存储方式 3.长度和容量 4.数组的索引 5.数组的函数传参 二.题目分析 1.数组的查 ...

  6. 《LeetCode零基础指南》(第一讲) 函数

    文章目录 零.了解网站 1.输入输出 2.刷题步骤 3.尝试编码 4.调试提交 一.概念定义 1.函数简介 2.函数的基本概念 3.函数的基本结构 4.返回类型 5.函数名 6.参数列表 7.函数体 ...

  7. [东哥的leetcode刷题日记] leetcode 278 :First Bad Version

    leetcode 278 :First Bad Version 题目链接: https://leetcode-cn.com/problems/search-insert-position/ 难度: 简 ...

  8. [东哥的leetcode刷题日记] leetcode 283 : Move Zeroes

    leetcode 283 : Move Zeroes 题目链接: https://leetcode-cn.com/problems/move-zeroes/ 难度: 简单 归类 : 数组操作 题目: ...

  9. [学习报告]《LeetCode零基础指南》(第四讲) 指针

    学习内容:https://blog.csdn.net/WhereIsHeroFrom/article/details/121551694 一.今日知识点总结 概念 指针 == 地址 数据放置在内存中, ...

最新文章

  1. Gaussian Filter
  2. 世界级数学大牛来了!2002年菲尔兹奖得主加盟华为
  3. tor screenrec屏幕录制+_ScreenFlow for mac(屏幕录制软件) v8.2.4中文版
  4. turbo c填充图形_C / C ++中的图形:Turbo C编译器中的简介和图形模式
  5. windows下使用cmake+mingw配置makefile(2)
  6. Linux下Eclipse给工程配置(附加库目录)
  7. angular学习的一些Mark
  8. 【ASP.NET学习笔记一】ASP.NET页面传参总结
  9. 解决Teamviewer屏保锁屏、黑屏无法进入问题
  10. 练习:《斗鱼视频》m3u8流视频采集下载+思路+Python
  11. Python小例子 | 如何将多张图片合成mp4视频格式,并加入背景音乐...
  12. React Native 每日一学(Learn a little every day)
  13. 仿IOS沉浸式状态栏实现
  14. 定义变量byte a = (byte)128输出a的结果
  15. 吴佳怡最新街拍曝光  潮酷girl演绎初秋时尚
  16. Linux 安装与多重引导摘要
  17. Gopher Meetup :久等了,武汉!
  18. wifi 驱动 进阶11
  19. 一文读懂什么是反卷积
  20. 无线摄像头接有线如何改协议_家用摄像头安装有啥需要注意的地方?

热门文章

  1. 爬取京东评论并制作词云图
  2. js的鼠标经过与离开事件
  3. iOS UIKeyboardType(键盘类型)~图解
  4. 高光谱图像分类与深度模型
  5. RRAM:闪存技术的终结者?
  6. 软件测试模式-敏捷测试
  7. Windows——Excel 打开.xls .xlsx 文件格式或文件扩展名无效
  8. 源码分析学习记录(6)——蒙皮
  9. 我在微软亚洲研究院生活中所接触的语言
  10. 设计模式之【装饰者模式】,实现“穿衣打扮”自由原来这么简单