算法题要重复刷的
前言
算法题有一些困难题,需要反复刷
还有一些技巧性题目,比如位运算
还有什么基础数学的那种,
LCR 138. 有效数字 - 力扣(LeetCode)
LCR 170. 交易逆序对的总数 - 力扣(LeetCode)
思路:一看要求onlogn肯定是归并排序
ps:冒泡排序也能做,但是会超时
我的问题在于:你如何知道合并的两个子数组是排序了的
答:其实就是一个归并排序的过程,只不过在处理期间去计算逆序对,因为你最早是从单个数字开始归并,所以肯定是排序了的
但是这一题和链表归并排序还不一样,有点小区别,你得用temp数组覆盖原来的
class Solution { |
二进制中1的个数_牛客题霸_牛客网 (nowcoder.com)
public int NumberOf1 (int n) { |
记住:n&(n-1)可以消除用二进制表示的n里面最后一位的1
不用加减乘除做加法_牛客题霸_牛客网 (nowcoder.com)
使用位运算:
异或可以提供两位的非进位信息
与运算可以提供进位信息
这里的操作是把所有的sum位和进位一起处理了
public int encryptionCalculate(int dataA, int dataB) { |
有一说一看不懂
50. Pow(x, n) - 力扣(LeetCode)
思路:分治,快速幂
还要求空间复杂度o1,我操你妈了
快速幂:当n为偶数,那么xn次方等于x n/2次方 的平方
n为奇数,还得再乘个x
public double myPow(double x, int n) { |
数组中只出现一次的两个数字_牛客题霸_牛客网 (nowcoder.com)
有一说一这个也挺难的,就是把他分类
我们知道如果有只出现一次的一个数字,那么对所有的数字异或,会留下这个只出现一次的数字
现在这里有两个只出现一次的a和b,那么我们全部异或,得到的结果就是a和b的异或
因为a和b不同,那么a和b肯定有一位,不同,就是说a的一位为1,b的一位为0
我们找到这一位,然后按这一位是不是为1进行分类,
然后对有相同性质的分别异或,留下来的就是a和b
知识点:x&-x可以取出二进制x中最低位的那个1,这个要牢记啊!!!
public int[] FindNumsAppearOnce (int[] nums) { |
LCR 138. 有效数字 - 力扣(LeetCode)
这题目太他妈恶心了,老子按照宫水三叶的题解来写
class Solution { |
路径总和3
233. 数字 1 的个数 - 力扣(LeetCode)
困难题,恶心的要死啊
反正记住了,那就拿23x4举例子,自己推吧
public int countDigitOne(int n) { |
和为S的连续正数序列_牛客题霸_牛客网 (nowcoder.com)
这一题不知道为什么,只能用做成晕的傻逼方法