Find Numbers with Even Number of Digits
给一个数组, 找到里面位数为偶数的数字的个数.
给一个数组, 找到里面位数为偶数的数字的个数.
写一个Iterator遍历长度为k的n个字符的组合. 这个题就是把Combination写成api. 所以先算出k个n的comb, 然后就直接输出
给一个数组和一个target, 求一个数字n, 把数组中所有大于n的数字都替换成n以后, 数组的和与target最接近. 这个题是找最接近target的一个数字n, 那么用二叉搜索找即可, 设lo是0, hi是target, 那么mid就是中间假设的答案, 这个答案可以通过题意的改变数组后, 找到和target的差值, 因为我们知道mid是单调递增的, 所以可以用二叉搜索.
给一个数组, 里面是一对对的数, 偶数位的数字表示频率, 奇数位的数字表示前一个偶数位的值. 求原始数组.
给一个2d数组和一个k, 求k的范围内的和. 这个题和range sum的那个一样的结构, 只是query部分稍加改动. 附上一个答案里很简练的做法.
给一个二叉树, 求爷爷是偶数的孙子node的值的和. 这个就是记录爷爷的val就可以.
求最少反转a和b中二进制的0和1的次数, 使得a|b=c. 这个题先要观察a|b=c的特性, 首先我们求出a|b, 通过和c做异或, 我们知道a|b和c有多少位上的数字是不同的. 记录做dd. 通过观察我们知道, 如果这种不同来自于两个情况, 第一是a和b一个是0, 另一个是1, 他们的a|b是1, 如果这个位上的c是0, 那么需要翻转一次. c是1的话, 那么a|b是0, 就是a和b都是0, 那么也只需要翻转一次(任意a和b)即可. 另一种情况是a和b都是1, 如果这个位上的c是0, 那么需要反转两次. 所以这个异或包含了上面两种情况, 但是对于第二种情况, 需要找出, 并且再加一次. 所以问题转化到, 如何在这个结果中找出, a|b都是1的位数? 首先算a&b得到a和b的都是1的位数, 然后再& (a|b)^c, 就得到得到(a|b)^c这个所有的位区别下, a和b都是1的位的个数. 然后加起来即可.
给一个数字n和一个2d数组, 里面是n个数字相连的情况, 问如何调整连接, 让n个数字都相连. 这个题是union-find的经典题. 首先我们知道连接n个node, 至少需要n-1个edge. 然后, 我们做union, 找到有多少个sub components. 把他们都union起来后, 这时需要的edge就是component的数目-1, 因为每个edge都只能连接两个component.
给一个数字n, 求两个数字A和B, A+B = N 并且A和B组成的数字没有0. 这个只能一个个查.
原文地址: http://codinggorilla.com/?p=91&cpage=1 这篇文章介绍了两种算法, Alstrup-Gavoille-Kaplan-Rauhe(AGKR) 和 Schieber-Vishkin. 他们是用来解决 Nearest Common Ancestor (NCA) 或者 Lowest common ancestor (LCA) 问题的. 首先, 文章给出了NCA/LCA问题的定义, 即在树状结构下, 求解任意两个node的最近公用node. 如上图中, node e和 node m 的公用node是a. 这个问题是 Alfred Aho教授提出的, 就是那个ac自动机匹配的那个a.. 文章给出了一个最简单的算法 这个算法是利用两个node的parent信息, 通过两个stack存储node的路径, 进而找到公用node. 这种解法的时间和空间复杂度是o(n). 最坏情况就是刚才的满树下的最左和最右. Schieber-Vishkin算法是由Baruch Schieber 和 Uzi Vishkin 通过简化 Harel and Tarjan的算法得来的. 它的复杂度包含了两个部分, o(n)的preprocessing(预处理)阶段和o(1)的query(解答)阶段. 在预处理阶段, Schieber-Vishkin算法需要重新编码整颗树: 首先假设一棵树是满树时, 对一棵树做inorder traverse. 并且加一个数字计数器, 便有下图: […]