JavaSE
下个路口见_20
Keep coidng!Keep learning!
展开
-
leetcode50:Pow(x, n)
思路:直接用循环来做,会提示超时。我们可以用递归来折半计算,每次把n缩小一半,这样n最终会缩小到0,任何数的0次方都为1,这时候我们再往回乘,如果此时n是偶数,直接把上次递归得到的值算个平方返回即可,如果是奇数,则还需要乘上个x的值。还有一点需要引起我们的注意的是n有可能为负数,对于n是负数的情况,我们可以先用其绝对值计算出一个结果再取其倒数即可。参考:http://www.cnblogs...原创 2018-09-23 10:02:53 · 174 阅读 · 0 评论 -
leetcode70:Climbing Stairs
思路:设f(n)为从1爬到第n层台阶的走法,则f(n)=f(n-1)+f(n-2)。代码:public class ClimbingStairs { public static void main(String[] args) { System.out.println(climbStairs2(44)); } public static int climbStair...原创 2018-09-24 14:45:32 · 243 阅读 · 0 评论 -
leetcode67:Add Binary
思路:从右边开始,逐位相加,包括进位。代码:public class AddBinary67 { public static void main(String[] args) {// System.out.println(addBinary("11", "1")); System.out.println(addBinary("1", "111")); } publi...原创 2018-09-23 20:59:58 · 263 阅读 · 0 评论 -
leetcode66:Plus One
思路:从后往前加,记录进位即可,但需要考虑各位全为9的情况,这样高位进位,需要将数组长度增加1个位置,这种情况出现的概率比较低,所以如果高位有进位,新开一个数组将原来计算的结果保存进去即可。...原创 2018-09-23 20:29:40 · 228 阅读 · 0 评论 -
leetcode64:Minimum Path Sum
思路:跟之前走方格的题差不多,只是状态转移方程稍微改变一下。dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];。代码:public class MinimumPathSum64 { public static void main(String[] args) {// int[][] num = { { ...原创 2018-09-23 20:06:35 · 242 阅读 · 0 评论 -
leetcode63:Unique Paths II
思路:在Unique Paths上多加了一些障碍点,做法同Unique Paths类似,只是在初始化和计算dp[i][j]的时候,需要判断i行j列是否为障碍点,如果是,表示路径不通,置为0,否则正常计算。dp[i][j]=dp[i - 1][j] + dp[i][j - 1]。代码:public class UniquePathsII63 { public static void...原创 2018-09-23 18:57:14 · 284 阅读 · 0 评论 -
leetcode56:Merge Intervals
思路:典型的区间合并问题,笔试中也经常遇到,可以将区间先进行排序,然后按顺序对能合并的区间进行合并即可,需要注意的是最后一个区间,如果不能和之前的区间进行合并,最后一个区间就会被遗漏,这里的做法是添加一个辅助结尾区间,intervals.add(new Interval(Integer.MAX_VALUE, Integer.MAX_VALUE));这样最后一个有效区间就能进行处理了。cl...原创 2018-09-23 18:30:12 · 186 阅读 · 0 评论 -
leetcode55:Jump Game
思路:遍历数组,并将当前位置能到达的位置全部置为true,遍历完成后后检查最后一个位置是否为true即可。代码:public static void main(String[] args) {// int num[] ={2,3,1,1,4};// int num[] ={3,2,1,0,4}; int num[] ={2,3,1,1,4}; System.out....原创 2018-09-23 15:46:22 · 165 阅读 · 0 评论 -
【面试题】leetcode62:Unique Paths
瓜子面试题思路:动态规划求解即可。代码:public class UniquePaths62 { public static void main(String[] args) { System.out.println(uniquePaths(7, 3)); } public static int uniquePaths(int m, int n) { int...原创 2018-09-23 15:13:02 · 211 阅读 · 0 评论 -
LeetCode3. Longest Substring Without Repeating Characters
思路:设定两个指针i,index,i负责遍历,index负责记录遍历过程中无重复字符的子串的开头,如果遍历过程中子串出现了重复字符,则将index指针指向重复字符的后一位,并计算长度,与最大值max进行比较,并更新重复字符的下标。详细解答参考:https://www.cnblogs.com/StrayWolf/p/6701197.html?utm_source=itdadao&ut...原创 2018-09-07 16:33:44 · 174 阅读 · 0 评论 -
【面试题】多区间二分查找
接上篇ip地址转整数。题目1:设计一个数据结构,里面包含ip地址的范围以及该范围内ip地址对应的城市,ip地址均采用整数形式表示。class IP2City{ String city;//如果city有id,用id也可以 Long start; Long end;}题目2:如果给你一个ip地址,快速判断它属于哪个城市,各个ip区间没有重叠的情况。当时的做法是:对n个区间对...原创 2018-09-07 12:11:02 · 522 阅读 · 0 评论 -
【面试准备】生产者消费者-BlockingQueue
题目:有两个线程A,B, A线程每200ms就生成一个[0,100]之间的随机数, B线程每2S中打印出A线程所产生的增量随机数。一、采用阻塞队列来做。public class TestBlockingQueue { static BlockingQueue<Integer> queue = new LinkedBlockingQueue<>(10);...原创 2018-08-22 11:03:09 · 730 阅读 · 0 评论 -
打印出某个路径下所有的文件夹和文件
横向:循环,纵向:递归public class PrintFiles { public static void main(String[] args) { File dir = new File("D:/ConditionTestManyToMany"); ArrayList<String> list = new ArrayList<>(); L...原创 2018-08-19 14:31:18 · 836 阅读 · 0 评论 -
leetcode72:Edit Distance
思路:设dp[i][j]表示word1中0-i个字符转换成word2中0-j个字符需要的最少次数,先对0行和0列所有元素进行初始化,然后从1行1列开始往后递推,最终将dp数组填充满,dp[row][col]即为最终结果。状态转移方程为:if(word1[i]==word2[j]):dp[i][j]=dp[i-1][j-1];else:dp[i][j]=Math.min(dp...原创 2018-09-24 16:11:39 · 172 阅读 · 0 评论 -
leetcode73:Set Matrix Zeroes
思路:使用常量的额外空间,肯定是要用数组的某一部分来记录0的位置,所以考虑采用第0行和第0列来记录(1,1)-->(n,n)中0的位置,因为之后第0行和第0列的值会改变,所以需要提前判断0行0列是否有0,最后做处理。代码:public class SetMatrixZeroes { public static void main(String[] args) { i...原创 2018-09-25 10:11:02 · 254 阅读 · 0 评论 -
leetcode49:Group Anagrams
思路:这道题让我们群组给定字符串集中所有的错位词,所谓的错位词就是两个字符串中字母出现的次数都一样,只是位置不同,比如abc,bac, cba等它们就互为错位词,那么我们如何判断两者是否是错位词呢,我们发现如果把错位词的字符顺序重新排列,那么会得到相同的结果,所以重新排序是判断是否互为错位词的方法,由于错位词重新排序后都会得到相同的字符串,我们以此作为key,将所有错位词都保存到map中,然后...原创 2018-09-22 19:07:17 · 178 阅读 · 0 评论 -
【面试题】leetcode48:Rotate Image
瓜子二面面试题思路:主要找到旋转前后下标之间的对应关系,matrix[j][n-1 - i] = matrix[i][j],但是在遍历过程中原数组被改变了,所以需要提前将原数组拷贝一份。代码:public class RotateImage48 { public static void main(String[] args) { int[][] num = { { 1, ...原创 2018-09-22 18:43:51 · 372 阅读 · 0 评论 -
leetcode47:Permutations II
思路:依然采用dfs+交换,多了去重步骤。代码:public class PermutationsII { public static void main(String[] args) { int[] num= {1,1,2}; System.out.println(permute(num)); } public static List<List<In...原创 2018-09-22 18:08:29 · 189 阅读 · 0 评论 -
leetcode46:Permutations
思路:排列问题,深度搜索+交换。代码:public class Permutations46 { public static void main(String[] args) { int[] num= {1,2,3}; System.out.println(permute(num)); } public static List<List<Integer...原创 2018-09-22 16:59:36 · 181 阅读 · 0 评论 -
leetcode45:Jump Game II
1.首先选用了dp来做,结果超时了。代码:public class JumpGameII45 { public static void main(String[] args) { int[] nums = {2,3,1,1,4}; System.out.println(jump(nums)); } public static int jump(int[] nums...原创 2018-09-21 21:00:11 · 227 阅读 · 0 评论 -
leetcode40:Combination Sum II
思路:本题在于数字不能重复使用,而且需要去重,可以先将数组排序,然后去重就方便了,依然采用深度优先的方法。代码:public class CombinationSumII { public static void main(String[] args) { int[] num = { 2, 5, 2, 1, 2 }; System.out.println(combina...原创 2018-09-21 16:40:43 · 223 阅读 · 0 评论 -
leetcode39:Combination Sum
思路:将数组中的每个点作为根节点,然后采用深度优先遍历即可,由于数字可以重复使用,所以递归时候注意下标。代码:public class CombinationSum39 { public static void main(String[] args) { int[] num ={2,3,5}; System.out.println(combinationSum(nu...原创 2018-09-21 15:46:40 · 207 阅读 · 0 评论 -
leetcode38:Count and Say
思路:对每个字符串判断连续相同为的个数,然后进行拼接即可。代码:public class CountAndSay { public static void main(String[] args) { System.out.println(countAndSay(1)); } public static String countAndSay(int n) { Str...原创 2018-09-21 15:21:06 · 164 阅读 · 0 评论 -
【面试题】棋盘走法总数问题
题目:给定一个mxn的棋盘,每次只能向右或向下走,从左上角走到右下角,有多少中走法?思路:可以使用动态规划,状态转移方程为:dp[m][n]=dp[m-1][n]+dp[m][n-1],也可以使用递归来实现。public class QiPan { public static void main(String[] args) { System.out.println(fun...原创 2018-09-20 09:44:38 · 1628 阅读 · 0 评论 -
【面试题】leetcode34:Find First and Last Position of Element in Sorted Array
思路:二分查找找到目标值,然后从目标值左右分别进行搜索,如果和目标值相同,则更新下标,否则结束(因为有序)。public class FindFirstandLastPositionofElementinSortedArray34 { public static void main(String[] args) { int num[] = { 5, 7, 7, 8, 8, 10 ...原创 2018-09-20 09:33:32 · 184 阅读 · 0 评论 -
leetcode24:Swap Nodes in Pairs
思路:关于链表的题,主要将指针关系理清,在指针改变之前,需要将指针的后继节点保存,防止链表断开。代码:public class SwapNodesinPairs24 { public static void main(String[] args) { ListNode node1 = new ListNode(1); ListNode node2 = new ListNo...原创 2018-09-11 10:43:05 · 278 阅读 · 0 评论 -
leetcode22: Generate Parentheses
思路:最终符合要求的字符串中,左括号和右括号个数都是n,而且在字符串生成过程中,左括号的剩余个数一定小于等于右括号剩余个数,如果左右括号剩余个数都为0,说明找到一个符合题意的字符串了,保存下来。所以可以采用递归,分别添加左括号和右括号,根据以上条件设置递归出口。代码:public class GenerateParentheses22 { public static void m...原创 2018-09-11 09:54:35 · 155 阅读 · 0 评论 -
【面试题】将ip地址转换成整数
题目:将ip地址转换成整数开始用了最粗暴的方法,将四段分别转换成二进制连接起来,然后扫描一遍,累加求和。效率太低。假设ip地址:110.111.112.113,即为A.B.C.D,转换成整数只需要将D左移0位(不需要移动),C左移8位,B左移16位,A左移24位即可。public class IP2Integer { public static void main(String[...原创 2018-09-07 10:16:15 · 4459 阅读 · 0 评论 -
leetcode20:Valid Parentheses
思路:括号匹配,每当出现右括号时,都和左边最近的进行匹配,如果能匹配,则消除,否则,则为不匹配。操作顺序符合栈的特点。代码:public class ValidParentheses20 { public static void main(String[] args) { String s = "([])[{}()(())]"; System.out.println(i...原创 2018-09-10 16:06:18 · 158 阅读 · 0 评论 -
leetcode27:Remove Element
思路:遍历数组,设定两个指针,当快指针指向的元素不为目标值时,将快指针指向元素赋值给慢指针指向元素,同时慢指针前进一步。代码:public class RemoveElement27 { public static void main(String[] args) { int[] arr ={0,1,2,2,3,0,4,2}; System.out.println(ne...原创 2018-09-11 16:17:16 · 240 阅读 · 0 评论 -
LeetCode:3Sum
先用了dfs来做,结果超时了,重新考虑题目的特点。思路:可以先将数组排序,然后固定第一个数i,然后设定两个指针,一个从i+1开始,一个从num.length-1开始,判断这两个位置的数的和是否等于0-nums[i],如果大于目标值,则右边指针左移,如果小于目标值,则左边指针右移,整个过程中,需要保证取到满足条件的元祖是唯一不重复的。如果固定过的数有重复的,可以跳过,set记录固定的数。...原创 2018-09-08 10:46:52 · 125 阅读 · 0 评论 -
leetcode26:Remove Duplicates from Sorted Array
参考:http://www.cnblogs.com/grandyang/p/4329128.html思路:我们使用快慢指针来记录遍历的坐标,最开始时两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针向前走一步,如果不同,则两个指针都向前走一步,这样当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数。代码:public class RemoveDupli...原创 2018-09-11 15:13:24 · 172 阅读 · 0 评论 -
LeetCode236:二叉树的最近公共祖先
思路:1.找出根节点到p节点的路径;2.找出根节点到q节点的路径;3.遍历两条路径,找到最后相等的公共节点。代码:public class LCA { List<TreeNode> list = new ArrayList<>(); List<TreeNode> listp = new ArrayList<>(); L...原创 2018-09-02 15:43:55 · 245 阅读 · 0 评论 -
LeetCode5. Longest Palindromic Substring
思路:采用动态规划来做,dp[i][j]表示s中下标i到下标j能否构成回文,递推公式为:dp[i, j] = 1 if i == j = s[i] == s[j] if j = i + 1 ...原创 2018-09-07 21:39:36 · 140 阅读 · 0 评论 -
LeetCode547. Friend Circles并查集
并查集介绍参考:https://juejin.im/entry/5922593d44d904006cd20175http://dongxicheng.org/structure/union-find-set/实现代码:class Solution { public int findCircleNum(int[][] num) { // 最初朋友圈的个数 int co...原创 2018-09-04 18:25:07 · 545 阅读 · 0 评论 -
【面试题】求整数数组中最大和的连续子序列
题目:整数数组中最大和的连续子序列数组:[-2,1,-3,4,-1,2,1,-5,4]子序列:[4,-1,2,1]最大和:6思路:从数组下标为0的元素开始,往后求和,如果当前和<0,则将和重置为0,每次求和后,与之前和的最大值比较,取最大值。代码:public class MaxSum { public static void main(String[] args) ...原创 2018-09-01 15:54:03 · 2815 阅读 · 0 评论 -
【面试题】最大乘积子序列
题目:给一个浮点数序列,找出最大乘积的连续子序列,并找出这个子序列。这个题类似leetcode152题,只是多了一步找出子序列。手撕代码时,只是想到了用动态规划,但却没有找到递推方程。因为不一定全是正数,所以要考虑到负数负负得正的问题,递推方程为:max = Math.max(Math.max(maxtmp*num[i], mintmp*num[i]), num[i]);min ...原创 2018-09-01 15:17:05 · 331 阅读 · 0 评论 -
多线程协作
线程1负责将初始值每次加1,直到100,在每次累加过程中,如果结果是10的倍数,通知线程2打印。class M { private int num = 1; public int getNum() { return num; } public void setNum(int num) { this.num = num; }}class CalThread implemen...原创 2018-03-21 10:48:23 · 233 阅读 · 0 评论 -
多线程执行顺序
public class MThread implements Runnable { private int ticket = 1000; { System.out.println("总票数:1000张"); } public void run() { for (int i = 0;; i++) { System.out.println(Thread.currentThre...原创 2018-03-18 20:07:09 · 309 阅读 · 0 评论 -
Java实现简单爬虫爬取天气预报
Java实现简单爬虫爬取天气预报原创 2017-12-07 09:51:53 · 5638 阅读 · 21 评论