1、两数之和
方法一:复杂度O(n2)
/*给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]*/
@Test
public void testTowSum(){
int[] nums ={2, 7, 11, 15};//要操作的数组
int target = 9;
int[] ints = towSum(nums, target);
for (int anInt : ints) {
System.out.print(anInt+"\t");
}
}
public int[] towSum(int[] nums,int target){
for(int i=0;i<nums.length;i++){
for (int j= i+1;j<nums.length;j++){ //j=i+1保证不取第二次取
//if守卫
if (nums[j]==target-nums[i]){
return new int[]{i,j};
}
}
}
return null;
}
方法二、(推荐, 复杂度 O(n))
public int[] towSum1(int[] nums,int target){
HashMap<Integer, Integer> map = new HashMap<>();
for (int i=0;i<nums.length;i++){
//目标减去遍历的数,看剩余部分是否存在于map中
int complement = target-nums[i];
if (map.containsKey(complement)){
return new int[]{map.get(complement),i};
}
map.put(nums[i],i);//map存入 key 数字, v 其对应下标
}
return null;
}
2、 无重复字符的最长子串
public int maxLengthSubString(String s){
// 哈希集合,记录每个字符是否出现过
HashSet<Character> occ = new HashSet<>();
int n = s.length();//得知字符串长度
// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
int rk = -1,ans = 0; //ans,表示当前不重复子串的长度
for (int i =0;i<n;++i){//遍历字符串的长度
if(i != 0){ //控制从重复元素位置之前截取的子串
// 左指针向右移动一格,移除一个字符
occ.remove(s.charAt(i-1));
}
while(rk+1 <n && !occ.contains(s.charAt(rk+1))){
//不断地移动右指针
occ.add(s.charAt(rk +1));
++rk;//自增
}
第 i 到 rk 个字符是一个极长的无重复字符子串
ans = Math.max(ans,rk-i+1);
}
return ans;
}
3、排序
int[] array ={5,2,4,0,8,1,1};
Arrays.sort(array);
for (int i : array) {
System.out.println(i);
}
4、求两个数组中位数
//获取两个数组的中位数
public Double median(Double[] arr1,Double[] arr2){
Double[] result = Arrays.copyOf(arr1, arr1.length + arr2.length);
System.arraycopy(arr2,0,result,arr1.length,arr2.length);
Arrays.sort(result); //聚合后升序排列
int totalLength = arr1.length+arr2.length;
int indexafter = totalLength/2;
if (result.length==1){ //如果只有一个元素
return result[0];
}
if (totalLength%2==0){//偶数
//中间两个值相加/2
return (result[indexafter]+result[indexafter-1])/2;
}else{//奇数直接是下标
return result[indexafter];
}
}
5、最长公共前缀
public String longestCommonPrefix(String[] str){
if (str.length==0){
return "不存在最长前缀";
}
String prefix = str[0];//初始化前缀获取字符串数组的第一个作为前缀
for (int i = 1; i < str.length; i++) { //不在遍历第一个元素
// 当前字符串
while (str[i].indexOf(prefix)!= 0){// 如果不存在头部
prefix = prefix.substring(0,prefix.length()-1);
if (prefix.isEmpty()) return "不存在最长前缀";
}
}
return prefix;
}