[小玄的刷题日记]《LeetCode零基础指南》(第二讲) 函数
371.两整数之和
1.两整数之和
1,“正常”思路
int getSum(int a, int b){return a + b; }
2,位运算
预备知识:有符号的整数通常使用补码来表示和存储。补码具有以下特性:
- 正整数的补码与原码相同;负整数的补码为其原码除符号位外的所有位取反后+1
- 可以将减法运算转换为补码的加法运算来实现
- 符号位与数值位可以一起参与运算
异或相当于一次无进位加法。来看一个例子
a ^ b得到了一个无进位加法运算结果,如果要得到 a + b 的结果的最终值,我们还要找到进位的数,把这二者相加
我们可以用与操作获得进位
由计算结果可见,0100 并不是我们想要的进位,1 + 1所获得的进位应该放在它的更高位,即在左侧位上,因此我们还要将 0100 左移一位,这才是我们所要的进位结果
总结一下:
- a + b 的问题拆分为(a + b 的无进制位结果) 和 ( a + b 的进制位结果)
- 无进位加法使用异或计算得出
- 进位结果使用与运算和移位运算得出
- 循环此过程,直到进位为 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相加
方法二
基本情况:
- B = 0 , 结果 == 0
- 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
- 当除数为32位有符号整数的最小值-2(31) - 1时,如果除数为1,我们直接返回 -2(31) || 如果除数为-1,那么答案为 2(31),产生了溢出,我们需要返回的值为2(31) - 1
- 当被除数为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。如果我们从右往左看,分治的思想就很明显了。
- 当我们要计算
时,我们可以先递归计算出 y =
,其中[n /2 ]表示对a进行向下取整
- 根据递归的结果,如果n为偶数,你们
=
;如果n为奇数,那么
=
* x
- 递归的边界为 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零基础指南》(第二讲) 函数相关推荐
- 【学习报告】LeetCode零基础指南 (第二讲)函数
ga一, 感觉今天自己水了好多题: 二, 三 ,解题分析与收获 通过做这几道简单的力扣题,我简单了解了力扣的评测,在英雄哥的带领下水了好几道题
- 【解题报告】《LeetCode零基础指南》(第三讲) 循环
☘前言☘ 今天是九日集训第二天,我会记录一下学习内容和题解,争当课代表0.0. 注意!!!!题解的解法一是今天要掌握的解法,解法2是学有余力再研究,涉及到后面知识点0.0 链接:<LeetCod ...
- 《LeetCode零基础指南》(第十一讲) 遇到不会的题怎么办?
文章目录 零.写在前面 一.认识自我 二.建立信心 三.解题报告 四.旧题二刷 五.沟通交流 六.前置知识 零.写在前面 当看到这篇文章的时候,确保已经参加过 [万人千题] 九日集训,并且加入 [ ...
- 《LeetCode零基础指南》导读
文章目录 一.出该专栏的目的 二.本专栏适宜人群 三.本专栏涉及的知识点 四.本专栏收费模式 五.付费玩家专属福利 六.专栏阅读须知 七.配套赠送福利 一.出该专栏的目的 由于之前的<算法零 ...
- 《LeetCode零基础指南》(第三讲) 一维数组
文章目录 零.了解网站 1.输入输出 2.刷题步骤 3.尝试编码 4.调试提交 一.概念定义 1.顺序存储 2.存储方式 3.长度和容量 4.数组的索引 5.数组的函数传参 二.题目分析 1.数组的查 ...
- 《LeetCode零基础指南》(第一讲) 函数
文章目录 零.了解网站 1.输入输出 2.刷题步骤 3.尝试编码 4.调试提交 一.概念定义 1.函数简介 2.函数的基本概念 3.函数的基本结构 4.返回类型 5.函数名 6.参数列表 7.函数体 ...
- [东哥的leetcode刷题日记] leetcode 278 :First Bad Version
leetcode 278 :First Bad Version 题目链接: https://leetcode-cn.com/problems/search-insert-position/ 难度: 简 ...
- [东哥的leetcode刷题日记] leetcode 283 : Move Zeroes
leetcode 283 : Move Zeroes 题目链接: https://leetcode-cn.com/problems/move-zeroes/ 难度: 简单 归类 : 数组操作 题目: ...
- [学习报告]《LeetCode零基础指南》(第四讲) 指针
学习内容:https://blog.csdn.net/WhereIsHeroFrom/article/details/121551694 一.今日知识点总结 概念 指针 == 地址 数据放置在内存中, ...
最新文章
- Gaussian Filter
- 世界级数学大牛来了!2002年菲尔兹奖得主加盟华为
- tor screenrec屏幕录制+_ScreenFlow for mac(屏幕录制软件) v8.2.4中文版
- turbo c填充图形_C / C ++中的图形:Turbo C编译器中的简介和图形模式
- windows下使用cmake+mingw配置makefile(2)
- Linux下Eclipse给工程配置(附加库目录)
- angular学习的一些Mark
- 【ASP.NET学习笔记一】ASP.NET页面传参总结
- 解决Teamviewer屏保锁屏、黑屏无法进入问题
- 练习:《斗鱼视频》m3u8流视频采集下载+思路+Python
- Python小例子 | 如何将多张图片合成mp4视频格式,并加入背景音乐...
- React Native 每日一学(Learn a little every day)
- 仿IOS沉浸式状态栏实现
- 定义变量byte a = (byte)128输出a的结果
- 吴佳怡最新街拍曝光 潮酷girl演绎初秋时尚
- Linux 安装与多重引导摘要
- Gopher Meetup :久等了,武汉!
- wifi 驱动 进阶11
- 一文读懂什么是反卷积
- 无线摄像头接有线如何改协议_家用摄像头安装有啥需要注意的地方?