算法习题

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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值