随笔分类 - Algorithms
摘要:转眼已经2016年3月1日了,前一阵子忙了很多事,包括下决心换了工作,也算是正式进了互联网行业。现在后头想想,人必须趁着有时间有精力时多折腾,毕竟人生短短几十年,如果不折腾以后肯定会后悔。 今天开始恢复更新博客了,计划今年要做的事: 1. 复习微积分 2. 复习概率论和统计学 3. 刷一遍leetc
阅读全文
摘要:函数将字符串中的字符'*'移到串的前部分,前面的非'*'字符后移,但不能改变非'*'字符的先后顺序,函数返回串中字符'*'的数量。如原始串为:ab**cd**e*12,处理后为*****abcde12,函数并返回值为5。(要求使用尽量少的时间和辅助空间)思路:类似于快速排序,用两个指针分别指向字符数...
阅读全文
摘要:根据一个有序数组,构造一颗二叉搜索树思路:因为数组有序,所以数组中间节点是该二叉树的根节点,因为二叉树的定义是右子树都大于根节点,左子树都小于根节点,构造完根节点后,分别截取数组的前半段和后半段分别递归构造左子树和右子树 1 package com.rui.microsoft; 2 3 publi...
阅读全文
摘要:12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? (Java版)思路: 从网上看了半天人家的分析,终于看明白了,在这里记录一下自己的思路先用一组数来代表这12个人, 1,2,3,4,5,6 7,8,9,10,11,12 排成两排,每排要递增排...
阅读全文
摘要:问题:求一个字符串中的最长回文子串 (java实现)比如字符串google, 它的最长回文子串是goog思路: 网上有时间复杂度是o(n)的解法,我的思路是是否可以利用以前学到的最长公共子串的解法,因为对于一个含有回文子串的字符串,其颠倒后的字符串必然也含有相同的回文子串,想到这一点,这个问题就变成...
阅读全文
摘要:69.求旋转数组中的最小元素。题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1思路: 1. 可以从左到右扫描整个数组,找...
阅读全文
摘要:68.把数组排成最小的数。题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法,并证明该算法 1 package com.rui.microsoft; 2 3 import...
阅读全文
摘要:66.颠倒栈。题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1 在栈顶。颠倒之后的栈为{5, 4, 3, 2, 1},5 处在栈顶。思路: 首先想到的是再创建一个新栈,用来接收旧栈的数据,但这样空间复杂度是o(n),可不可以用原有的栈完成颠倒的操作呢?假设栈里只有两个元素1,2,...
阅读全文
摘要:63.在字符串中删除特定的字符。题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”, 则删除之后的第一个字符串变成”Thy r stdnts.”。思路:1. 位图法 将两个字符串分别转换成bitmap 然后对他们做异或...
阅读全文
摘要:62.找出链表的第一个公共结点。题目:两个单向链表,找出它们的第一个公共结点思路:1.暴力法 但时间复杂度太高 o(n*m)2.如果两个链表有公共节点,则从该公共节点起,后面的节点均为公共的,即这两个链表在第一个公共节点交叉,然后形成一个Y字型,因为两个链表长度不一定一样,所以可以先求得他们的长度n...
阅读全文
摘要:题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值以前做过相似的,可以用递归解决,也可以用非递归解决 1 package com.rui.microsoft; 2 3 import java.util.Stack; 4 5 public class Test_LinkedLis...
阅读全文
摘要:求一个一维数组中的最长递增子序列的长度比如,在序列{1, -1, 2, -3, 4, -5, 6, -7}中,其最长的递增子序列为1,2,4,6思路: 编程之美上的题,也是蛮经典的动态规划题。 思路还是去找规律,我们拿LCS来表示最长递增子序列的长度第一个数1, 则LCS(1)=1, 因为就一个数嘛...
阅读全文
摘要:基础才是最重要的, 好久不写排序了,今天写了一下还是各种报错。。。。要养成习惯,每天至少做一道算法题 1 //复习各种排序 2 public class SortApp { 3 4 public static void main(String[] args) { 5 int...
阅读全文
摘要:Problem: given a tree, color nodes black as many as possible without coloring two adjacent nodes思路: 如果根节点r被标记为黑色,则其直接子节点不能被标记为黑色,如果不标记r,则其子节点可以标记为黑色,得...
阅读全文
摘要:无向连通图的割点又被成为关节点(articulation point), 移除关节点,则原连通图变成两个连通分量, 一个没有关节点的连通图被成为重连通图 (biconnected graph)要寻找无向连通图中所有的关节点,比较便捷的方法是利用一次深度优先遍历,找到所有关节点对于节点u,及其子节点v...
阅读全文
摘要:35.求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3思路: 可以用一个2X2的二维矩阵从第一行开始依次遍历直到找到和是最大的那个子矩阵,但暴力破解一般都不是最优答案。 我的想法是如果用2X2矩阵逐行遍历的话,其实每次计算2...
阅读全文
摘要:30.在从1到n的整数中1出现的次数题目:输入一个整数n,求从1到n 这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11 和12,1 一共出现了5 次。分析:这是一道广为流传的google 面试题思路:第一反应是遍历这N个数,然后对每个正数n不断用1...
阅读全文
摘要:任意给定一个32位无符号整数n,求n的二进制表示中1的个数,比如n = 5(0101)时,返回2,n = 15(1111)时,返回4思路:最直观的方法是对n和0001做&运算,如果结果为1,则counter加一,否则不变,然后将n右移一位,直到n=0为止. 方法count1和count2都是这种思路...
阅读全文
摘要:27.跳台阶问题题目:一个台阶总共有n 级,如果一次可以跳1 级,也可以跳2 级。求总共有多少总跳法,并分析算法的时间复杂度思路:通过数学归纳法n=1 1n=2 2n=3 3n=4 5n=5 8可知n>=3时 f(n)=f(n-1)+f(n-2) 是一个斐波那契数列, 该问题的时间复杂度也就是求斐波...
阅读全文
摘要:26.左旋转字符串题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef 左旋转2 位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n 的字符串操作的复杂度为O(n),辅助内存为O(1)思路:先反转整个字符串 -> fedcba 在分别反...
阅读全文

浙公网安备 33010602011771号