![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数学
tzyshiwolaogongya
这个作者很懒,什么都没留下…
展开
-
leetcode342——Power of Three
题目大意:判断整数是否是3的幂次方分析:整数限制。3的幂次方在int范围内最大的是1162261467,因为log3(INT_MAX)=19.56,3^19=1162261467。由于3是质数,所以1162261467的除数都是3的幂次方,也就是1162261467除以3余数应为0。所以3的幂次方满足:1162261467 % num = 0。代码:class Solution {public: bool isPowerOfThree(int n) { return原创 2020-07-29 15:11:32 · 98 阅读 · 0 评论 -
leetcode342——Power of Four
题目大意:判断整数是否是4的幂次方分析:位运算。在leetcode231的基础上,num是2的幂次方需要满足二进制最高位为1其余都是0,也就是(num & (num - 1)) == 0,而4的幂次方是就是2的偶数幂次方,也就是最高位的1在偶数位上(0、2、4...位),所以num&(101010...10)应该为0,二进制(101010...10)对应十六进制0xaaaaaaaa。代码:class Solution {public: bool isPowerOfFo原创 2020-07-29 15:04:21 · 122 阅读 · 0 评论 -
leetcode231——Power of Two
题目大意:判断整数是否是2的幂次方分析:二进制位运算方法一:n不断除以2再模2判断余数是否为0,时间复杂度O(logn)。方法二:位运算,2的幂次方数是由2^0不断×2得到的,也就是1不断左移的过程,所以2的幂次方数的二进制都是最高位为1,其余位都是0的。而这个数-1之后变成最高位为0,其余位都是1。所以有n&(n-1)=0。注意n≤0时一定返回false,所以先排除,不然测试数据有INT_MIN,INT_MIN-1就会造成溢出问题。代码:class Solution {pu原创 2020-07-29 14:37:58 · 109 阅读 · 0 评论 -
笔试——交替01子序列
题目大意:给出长度为n的01组成的字符串,可以选择任意的连续片段做翻转(0变1/1变0),问修改后最大01交替子序列的长度(子序列意味着可以不连续)分析:找规律。如果原串中只有1个00(或11)出现=>翻转后可以得到最长n位的交替序列;如果有多个00(或11)出现,统计相邻位不同的数cnt,可以得到最长cnt+2位的交替序列。也就是需要遍历字符串记录相邻两位不相同的位数,例如10100010,其中有6位和它的相邻位(前一位)不同,意味着有多个连续的00(或11),那么答案为6+2;例如101010原创 2020-07-08 17:41:02 · 2982 阅读 · 1 评论 -
leetcode461——Hamming Distance
题目大意:计算两个整数的汉明距离(两个数的二进制位中不同的位置个数)分析:位运算。计算汉明距离:只要统计两个数的异或中有几个1即可。比如1(0001)和4(0100),异或后(0101)就能显示出有几位不同。异或操作——0^1=1,0^0=0。方法一:库函数。C++:return bitset<32>(x^y).count();JAVA:return Integer.bitco...原创 2020-03-29 10:07:31 · 129 阅读 · 0 评论 -
leetcode89——Gray Code
题目大意:求n为二进制格雷码,例如n=2,格雷码为00,01,11,10;n=3,格雷码为000,001,011,010,100,101,111,110分析:递归减治法。假设已知n-1位的格雷码,求n位的格雷码。也就是在已有格雷码前面分别添加0和1,添加0后的十进制数就还是原来的n-1位格雷码,添加1后的十进制数会加2^(n-1)。代码:转载自https://www.cnblogs.com...原创 2019-10-25 16:14:46 · 118 阅读 · 0 评论 -
leetcode137——Single Number Ⅱ
题目大意:线性时间+不使用额外空间,找到数组中只出现过一次的数字,其他数组都出现过三次分析:位运算代码:class Solution {public: int singleNumber(vector<int>& nums) { int seenOnce = 0,seenTwice = 0; for(int i = 0;i ...原创 2020-02-25 12:07:50 · 91 阅读 · 0 评论 -
leetcode136——Single Number
题目大意:线性时间+不使用额外空间,找到数组中只出现过一次的数字,其他数组都出现过两次分析:位运算。如果可以使用额外空间,则采用哈希表记录数字出现次数即可。O(1)空间复杂度的解法需要利用位运算。异或XOR运算:两者值不同返回1;两者值相同返回0性质:a⊕0=a;a⊕a=0;a⊕b⊕a=(a⊕a)⊕b=0⊕b=b(满足交换律和结合律)因此所有数进行XOR运算即可得到唯一出现的数字...原创 2020-02-24 11:47:13 · 93 阅读 · 0 评论 -
leetcode628——Maximum Product of Three Numbers
题目大意:给出一个整数数组,求出其中三个数相乘的最大乘积是多少分析:数学考察。分析最大乘积只有两种情况:要么是最大的三个数相乘(全是正数、全是负数、只有一个负数、只有一个正数) 要么是最小的两个负数相乘再乘以最大的一个正数...原创 2018-08-01 16:51:20 · 103 阅读 · 0 评论 -
leetcode191——Number of 1 Bits
题目大意:求出n的二进制中有几个1代码:class Solution {public: int hammingWeight(uint32_t n) { int ans = 0; while(n != 0){ ans += n & 1; n = n >> 1; }...原创 2018-07-29 17:05:23 · 108 阅读 · 0 评论 -
leetcode89——Gray Code
题目大意:给出n位二进制数的全排序,序列中相邻两个之间只能更改一位数字。分析:格雷码的应用。十进制数可以用格雷码转换成二进制数greycode=i^i >>1。(使用二进制异或运算。例如:n=2时,i=00,01,10,11,依次的格雷码就是(00^00,01^00,10^01,11^01)。代码:转载自https://blog.csdn.net/u012501459/article/...原创 2018-06-07 21:20:02 · 127 阅读 · 0 评论 -
leetcode65——Valid Number
题目大意:给出一个字符串,判断它是不是合法数字分析:数学考察。要全面考虑清楚什么情况下才属于合法数字: 1.数字前后都可以有空格,但中间不允许有 2.数字前面可以出现正负号 3.小数点'.'只能出现一次,前面可以没有数字 4.符号'e'只能出现一次,且e后面不能出现小数点,可以出现正负号 5.除了上面提到的字...原创 2018-05-07 15:33:20 · 134 阅读 · 0 评论 -
leetcode67——Add Binary
题目大意:给出两个字符串,各代表一个二进制数,求他们的和(返回二进制字符串)分析:数学考察。注意进位。(二进制加法器的实现)代码:转载自class Solution {public: string addBinary(string a, string b) { string result = ""; int c = 0; //进位初始化为0 in...原创 2018-05-10 14:22:18 · 548 阅读 · 0 评论 -
leetcode66——Plus One
题目大意:给出非负数的一维数组,它代表一个数字,求它加一后的数组,例如[1,2,3]返回[1,2,4]分析:数学考察。注意进位即可。当每位都是9时会出现最后还剩下进位的情况,要将进位插入数组最前面。代码:class Solution {public: vector<int> plusOne(vector<int>& digits) { int n = digits...原创 2018-05-09 15:13:18 · 105 阅读 · 0 评论 -
leetcode60——Permutation Sequence
题目大意:求出n个数字的全排列中的第k个分析:数学规律。一开始想用回溯法结果超时了,时间复杂度太大是O(n!)。所以考虑找一下数学规律。 确定下第一个数后,它的全排列个数就是(n-1)!个。要找第m个数,就意味着要知道在m个数之前已经找到过多少个(n-1)!,这样一来就能确定我们要找的答案序列的第一个数字是几。比如有p个(n-1)!,那么第一个数字就是p+1。循环找出第二个数字,...原创 2018-05-01 14:40:38 · 230 阅读 · 0 评论 -
leetcode29——Divide Two Integers
题目大意:在不使用*、/、%这三种符号的情况下,算出商(dividend/divisor)分析:数学思路考察。不让用除号可以考虑加减法,当dividend大于divisor的时候,dividend就可以减去一个divisor,最后的答案就是能减去divisor的个数,但是这种循环会超时,效率太低。所以我们考虑用移位这个符号,左移一位相当于乘2,左移n位就是乘2^n,大大缩减了减法的次数。最终结果就...原创 2018-04-13 14:51:06 · 147 阅读 · 0 评论 -
leetcode43——Multiply Strings
题目大意:将给出的两个用字符串形式显示的数字相乘,结果返回字符串形式的乘积分析:数学规律考察。这里利用一个数学规律: 如图所示,第一个字符串的index i与第二个字符串的index j相乘的结果出现在最后结果字符串的下标i+j和i+j+1处。代码:转载自https://blog.csdn.net/qq_14821023/article/details/50822207class...原创 2018-04-18 16:56:24 · 113 阅读 · 0 评论 -
leetcode31——Next Permutation
题目大意:找出给出数字排列的下一个排列分析:数学规律题。其实题意就是找出比现在这个数大一个排列方式,如果已经是最大排列,那么就变成最小排列。比如1->2->3就变成1->3->2,比如3->2->1已经是最大排列了,就要变成最小排列,升序即可1->2->3。下面解释一下这个情况就懂了:比如开始序列是5 4 7 5 3 2,可以看出红色部分已经是最大排...原创 2018-04-14 14:57:18 · 112 阅读 · 0 评论