这个是LeetCode上面的编程训练专项页面,地址:https://leetcode-cn.com/explore/interview/card/top-interview-quesitons-in-2018/262/summery/
总体,比较系统、全面。在解决这些问题的时候,我都是先尝试使用自己的方法coding一遍,之后在看看其他比较巧妙的解决方法学习一下。
0,热身编程题
0.1只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
package com.cnblogs.mufasa.QA1_makeAhotDOU; import org.junit.Test; import java.util.Arrays; public class Solution1 { //速度也还行,时间复杂度大致为O(nlogn+n/2),相对性能要差一些 public static int singleNumber1(int[] nums) { Arrays.sort(nums); int len=nums.length-1; for(int i=0;i<len;i+=2){ if(nums[i]!=nums[i+1]){ return nums[i]; } } return nums[len]; } //***最优化的解法***,时间复杂度为O(n) public static int singleNumber(int[] nums) { int temp=nums[0]; for(int i=1;i<nums.length;i++){ temp^=nums[i]; } return temp; } @Test public void test() { // int[] nums=new int[]{1,1,2,2,6,7,7,6}; int[] nums=new int[]{4,1,2,1,2}; System.out.println(singleNumber(nums)); System.out.println(singleNumber1(nums)); } }
0.2求众数
给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/2 ⌋
的元素。
你可以假设数组是非空的,并且给定的数组总是存在众数。
package com.cnblogs.mufasa.QA1_makeAhotDOU; import org.junit.Test; import java.util.Arrays; import java.util.Map; import java.util.TreeMap; public class Solution2 { //最完美的解决方法,时间复杂度可以降低到O(NlogN) public int majorityElement1(int[] nums) { Arrays.sort(nums); return nums[nums.length/2]; } //利用TreeMap来进行排序,更新出现频率大小 public int majorityElement(int[] nums) { TreeMap<Integer,Integer> treeMap=new TreeMap<>(); for(int i=0;i<nums.length;i++){ if(treeMap.get(nums[i])!=null){ treeMap.put(nums[i],treeMap.get(nums[i])+1); }else { treeMap.put(nums[i],1); } } int loc=-1,max=0; for(Map.Entry<Integer,Integer> kv:treeMap.entrySet()){ if(kv.getValue()>max){ loc=kv.getKey(); max=kv.getValue(); if(max>nums.length/2){ break; } } } return loc; } @Test public void test() { int[] nums=new int[]{2,2,1,1,1,2,2}; System.out.println(majorityElement1(nums)); System.out.println(majorityElement(nums)); } }
0.3搜索二维矩阵 II
0.4合并两个有序数组
0.5鸡蛋掉落
1,字符串
1.1验证回文【以前写过,比较简单】
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。