百家了—八口算法?

二八杠口诀麻将牌推筒子绝技,二八杠的生死门,经典算法

二八杠口诀麻将牌推筒子绝技,二八杠的生死门,经典算法

二八杠口诀麻将牌推筒子绝技,二八杠的生死门,经典算法

}

一个数组有N个数,给一个数字S,找到数组两个数字加起来等于S,这个数组中只有一个解

根据数组构建一个map,key是数字,value是数字在数组的位置。遍历数组,查看map中是否有key=S-当前数组位置值。如果有返回map的value和当前位置,没有的话当前值和位置进入map。

两个链表节点都存的是单个数字,两个链表从头开始相加,最后的结果是链表表示两个数字相加的结果。2->4->3 5->6->4. 相加结果是 7->0>8

1.遍历2个链表,如果两个链表节点都是空了退出循环,判断如果有进位构建一个数值为1的节点连到新的队列。
2.遍历流程是:计算2个节点的值+进位值=n,n%10等于当前位的值,n/10等于进位信息。然后到下一个节点如此递归。

求一个字符串中最长子串,没有重复字符

1. 从字符串第一个字符开始遍历,往前推找最长子串,比如当前位置10,往9位置看一直看到没有重复字符
2. 求一个位置i往前看最长不重复子串,依赖这个字符之前最后一次出现的位置和i-1位置求出的最长子串位置的最大值。

求两个有序数组的中位数,如果数组加起来是偶数返回两个数字除以2.

取第一个数组的上中位数,与第二个数组的上中位数比较。如果相等返回,如果小于取第一个数组大于中位数部分和第二个数组小于中位数部分,组成一个新数组重新取中位数。大于的时候是一样。

给你一个数组,数组的值代表柱子高度,选择两个柱子能装最大的水量。

取第一个数字和最后一个数字算水量。 如果左边数字比较小,左边下标右移然后计算水量。如果右边数字小,右边下标左移计算水量。左右下标碰撞计算完毕,取计算水量的最大值

求一个字符串数组中,所有字符串的公共最长子串

取第一个字符串,循环遍历后续所有字符串,每个字符串与第一个字符串求公共子串,保留位置。取所有位置最小的

一个数组,三个数字相加等于0,给出所有这种组合

1.求两个数据相加等于N的所有组合(二元组),数组先排序,两个指针,一个头一个尾,相加与N比,等于N收集答案。如果小于N,左边指针右移,如果大于N,右指针左移。
2.假设结果的第一位为是数组的第一位,那么就是求下标1开始的子数组的二元组问题。假设结果的第一位为数组第二位,依次类推

一个计数器,每个数字代表三个字母,如果按了N个数字,计算所有组合的字母。

1.按每个个数字可以做3个决定,可以采取暴力深度递归,每个决定后再取下一个按键代表的3个决定,直到按键按完。按完的时候每一步的决定组合起来就是答案。

给你一个链表,删除倒数第N个节点

双指针,第一个指针先挪N位,第二个指针开始跟着挪。

给一个字符串,包含3种括号{[()]},判断是否一一匹配

字符是左括号入栈,是右括号,栈弹出配对,如果配对失败不符合规则。如果字符串遍历完都配对成功,符合规则

一个字符 串只能包含(),假设要构建的字符串长度为6,需要满足括号配对。比如()()(),((()))。问总共有多少这种组合

方案1:暴力递归,每个位置只能做()两个决定,组合出所有决定,然后判断这些决定中哪些字符串合法。
方案2:需要剪枝,如果前面都做了三个(决定,后面不能够再做(决定了。用数字表示做了几次(的决定,下一个是(的决定取决于已经做过几个了。
取各个链表的第一个节点丢入小根堆,然后弹出作为头结点。取弹出节点的下一个节点丢入小根堆,然后弹出堆顶元素,直到堆空。利用小根堆,priorityQueue。

给一个有重复数字的数组,把所有不重复的数字放到数组前面。

两个指针,done在0位置,cur在1位置。 判断cur和done是否一致,一致cur右移动。不一致done右移,done位置的数字和cur位置的数字互换,cur右移。

一个数组找缺少的最小整数,比如数组是129,结果是3. 数组是569,结果是4.

数组0位置放1,依次类推,知道找出最长有效数组,比如找到1234,那最小正整数是5.
L指针指向0位置,R指针指向末尾。 如果L指针指向的位置数字比R位置要放的数字(R+1)要大,L上的数字要废弃,L和R位置数字交换,R左移。直到L和R相撞,如果L上的数字不比R+1大,那把L上的数字V与V-1位置的数字交换。

求某一个位置可以装的水量,等于这个位置往左的最高点和往右的最高点中的最小值与本身值的身高差。所有位置的水量加起来

指针在0位置,判断最大可到达位置为max。指针+1,判断位置是否大于max,如果大于,返回false。否则判断从当前位置能够跳的最大距离与max比取最大值。
第一个位置可以做N个决定,第二个位置可以做N-1个决定,依次类推
先旋转最外层,再旋转里面一层,依次类推

19. 计算一个数字的N次方


解法:比如求Y的N次方,N按二进制表示,比如10次方:1010。代表Y的2次方+Y的8次方。


解答:先打印最外层,然后打印里面一层,直到结束。最里面一层可能是一个圈,可能是一行或者一列,或者一个点。


解答:第一行和第一列每一个格子到达只有一种走法,第(x,y)个格子抵达的走法等于x-1,y和x,y-1两个格子走法相加。


解答:有障碍物的格子走法变成0,其他的走法与第一种相同。


解答:二分法,1-N二分,如果中间位置m*m大于n左边找,否则右边找。


首先,迭代计算出0、1 和 2 元素的个数,然后按照0、1、2的排序,重写当前数组

27. [只出现一次的数字】


所有的数字进行异或操作,结果就是

28. [复制带随机指针的链表]

每个节点进行复制,放入map,key为原节点,value为复制后节点。然后处理复制出来节点的指针。

场景1:字符串第一个字符是否在字典中,如果在,分解方法等于后续子字符串的分解方法。
场景2:字符串前2个字符是否在字典中,如果在,,分解方法等于后续子字符串的分解方法。
依次类推。改动态规划:【0,j】区间是否可以被拆分,取决于之前的某个i位置(i<j)能否被拆分+[i,j]是否在字典中(i从0到j遍历)

一个快指针,一次走2步,一个慢指针走1步。如果快指针走出去了,没有环。如果两指针相遇,慢指针不动,快指针从头开始走,再次相遇即是入口

双链表(自己实现)+map
map,存key和kv构建的node,链表从尾部放入node(头是最久数据)。
get的时候从map中拿,然后调整node的位置。

链表用归并排序,拆成2部分排序,然后合并。

必经过某个点,算出最长路径。遍历后续所有点与某个点算斜率,放入map(key为斜率,value为节点)

栈,数字入栈,遇到运算符弹出2个数字计算重新入栈

求每个以nums[i]结尾的子数组最大乘积,最大乘积有3种情况:自己就是最大,自己是整数的时候乘以nums[i-1]的最大乘积,自己是负数的时候乘以nums[i-1]的最小乘积。取3者最大。

实现一个栈,可以push和pop方法和获取最小元素的方法
解决:设计2个栈,第一个栈正常压,第二个栈进入的时候判断栈里的元素是否要小,如果小就栈顶元素重复压,否则数据进栈

算每个链表的长度,假设是 100和80,都遍历到最后,如果最后节点不相交,链表不相交。如果尾节点相交,长链路从头节点开始走20步骤,短链表指针开始走,相遇的时候即是第一个相交节点。

找到一个数组中的一个局部高点,用logn算法
解法:第一个点和最后一个点先判断,如果第一个和最后一个都不是,表示数字高于0位置低于尾位置。进行二分如果中间点大于中间前一个位置和后一个位置,则返回m。如果不是,左侧比m小左边继续二分。否则肯定是右侧比他大,右侧二分。

1.遍历数组,判断每个数字与区间lower的区间,然后把lower增长到这个数字。遍历第二个数字判断与lower的区间,依次执行。

a/b作为小数点前部分,余数*10/b,把余数的位置map记录下来,如此往后计算,直到余数重复。

依次删除2个不同的数字,最后留下来的数字就是答案。靶子血量的概念。数字进来,判断血量为0,数字作为靶子,血量+1。如果血量不为0,判断数字是否等于靶子,等于血量+1,否则血量-1.

获取32数字每一位,先获取第一位,在获取第二位。第一位放入结果中,遍历依次结果左移一位,依次类推

左部分逆序,右部分逆序,整体逆序

m&(~m+1)提取最后一个1,统计数+1,然后m^=提取一个1后面的结果,判断m不为空,如此循环即可

遍历二维数组,遇到1就改为2,并且上下左右把所有1改为2,岛屿次数+1.

不停计算,用set保留每一次计算的结果,如果下一次的结果在set里面存在则不是快乐数。

课程依赖关系建立成一张图,先取入度为0的节点,依次取下一阶段入度为0的节点,直到课程都遍历完,所有入度为0的节点数等于依赖数。

快速排序,找到一个数字,如果刚好是k大元素,返回,如果不是从左边或者右边找

中序遍历,访问的第k个元素

快慢指针,快指针走2步,慢指针走一步,定位到中间节点,然后把中间节点的后面部分链表反转,接着比较2部分链表。

map存放每个节点的父节点k:节点,v:父节点。找p的所有父节点放入Set中,依次找q的父节点,如果节点在Set中,那就是最近公共祖先

把下一个节点的值赋给当前节点,当前节点指针指向下下个节点

环形链表概念,慢指针一步,快指针2步,快慢指针相遇,慢指针归0,快指针和慢指针都走一步,相遇即是结果。 我们对nums 数组建图,每个位置 i 连一条 i→nums[i] 的边.

定义一个栈,结果是栈里元素相加。 第一个数字num1先入栈,第二个是计算符号先变量暂存ys1,取第三个数字num3完成后,到第2个运算符ys2的时候,判断第二个计算符合ys1是什么。如果是+,数据num3 push栈,如果是-,push负的num3。如果是*num3与栈pop数据num1相乘入栈,如果是除栈pop数据num1除数据num3. 然后暂存ys2.

遍历数组,找到所有不是0的数字的乘积为all,找到多少个0假设问zeros。如果zeros没有,则每个nums的值等于all/自己,如果zeros=1,只有值为0的位置等于all,其他位置等于0. 如果zeros>1所有位置等于0

从第一行最后面一个元素m开始找,如果target>m,往下找,如果targe<m往左找。

用一个256的数组,记录每一个字母出现的次数,比如字母a的ascii码是97,那num[97]++.遍历一个字符串得到。 遍历另外一个字符串,将统计字母的次数--,一旦有一个减成负数返回不是。

定义dp[i]为必需包含i位置的最长子序列,它等于前面所有数字小于自己位置的dp[j]的最大值+1。 结果就是所有dp中的最大值。

62.寻找名人,一个节点,所有其他节点都认识他

一次遍历,找到后面所有节点都不认识他。假设他为80位置,总共100个点。
第二次遍历,前面79个点判断是否都认识80的位置。如果是返回80位置。

构建大根堆,小根堆。 大根堆为空进大根堆,数据小于大根堆顶,进大根堆否则进小根堆。进行balance,如果大根堆数量等于小根堆数量+2,大根堆弹出堆顶进入小根堆。小根堆数量=大根堆数量+2,小根堆弹出堆顶进入大根堆。
数据遍历完成后,如果大根堆数量等于小根堆数量,两个都弹出堆顶相加除2. 否则哪个堆多一个元素取对应堆元素。

按层遍历,先把缺的左节点或者右节点补空,然后按层访问放入数组中,接着反序列就好

分治思想,先遍历2个数组,计算所有组合相加和出现的次数map,遍历后面2个数组,所有组合中,一个一个判断是否在前面加工的map中出现相反数,如果是收集结果。

排序,然后按中间分隔,然后把后面部分的依次插入前面部分的中间。

奇数节点单独生成一个链表,偶数节点单独生成一个链表,然后把链表连起来。

定义一个函数process(int[][]matrix, int i, int j)表示从i,j出发的最长路径。里面递归从上下左右走。 递归会比较耗时,定义一个dp[i][j],记录从i,j出发的最长路径。process方法先判断dp[i][j]是否有值,有的话,直接返回,规避重复计算。

问题等价于,nums[i]左边的最小值是否小于nums[i], 右边的最大值是否大于nums[i]. 构建2个数组,最小值数组和最大值数组。

76. 至多包含 K 个不同字符的最长子串

滑动窗口:只要窗口内元素个数小于k就不断扩张窗口,随后如果大于k就不断收缩窗口

遍历数组,统计每个数字的个数,当做一个对象(两个属性,一个值,一个统计次数)。构建小根堆,小根堆大小为k,

改成位运算,a^b为无进位相加,a&b<<右移一位,直到进位信息为0.

构建小根堆,小根堆的元素从0,0开始,0,0弹出,把右边和下边的数据进入小根堆。依次弹出堆顶,然后把弹出元素的右边和下边进入堆。

两个map,第一个k是值,v是第几次进来的,size初始化为0,第二个mapk是位置,v是值。第二个map的k要保证连续,如果remove元素,末尾元素挪动到空的位置。

随机选择一个数字与N-1交换,然后随机选择一个数字(在0-n-2区间)与N-2交换

统计每一个字符出现的次数,用int[]256数组表示。 遍历字符串,发现哪个字符的统计次数为1即是结果。

子串问题,以什么什么结尾。 以i结尾的最长子串,为i-1位置的最长,考虑这个最长占的长度前一个字符是否为(。如果是再+2,然后再加前一个的dp值。

递归反转,先反转右节点,然后把右节点赋给左节点。然后反转左节点赋值给右节点。

节点x的最佳收益,1)不抢x,左子树不抢和抢收益的最大值+右子数抢与不抢的最大值,4个值里面取一个。2)抢x,x的收益+不抢左子树和不抢右子树的最大值。这里说的左子树不抢是指左子树的头结点不抢。

}

我要回帖

更多关于 打百子口诀 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信