day07_算法训练

news2024/11/28 18:40:09

案例零:整数反转(大整数算法)

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

暂时不用考虑数据太大的问题,把本题的核心思路写出来即可

比如:

​ 输入:x = 123
​ 输出:321

​ 输入:x = -123
​ 输出:-321

​ 输入:x = 120
​ 输出:21

​ 输入:x = 0
​ 输出:0

要注意,考虑到特殊情况:数字大于2147483647,反转之后就超出范围了,此时就要返回0

public class Test00 {
    /*
        给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
        暂时不用考虑数据太大的问题,把本题的核心思路写出来即可
        比如:
            输入:x = 123
            输出:321

            输入:x = -123
            输出:-321

            输入:x = 120
            输出:21

            输入:x = 0
            输出:0
        要注意,考虑到特殊情况:数字大于2147483647,反转之后就超出范围了,此时就要返回0
     */
    public static void main(String[] args) {
        System.out.println(reverse(123));
        System.out.println(reverse(-123));
        System.out.println(reverse(2147483647));
        System.out.println(reverse(-2147483647));
    }

    //把num进行反转,如果超过了整型的最大范围,需要返回0
    public static int reverse(int num) {// 12345  -12345
        //1.把num变成一个字符串
        String numStr = num + ""; //"12345" "-12345"

        //2.定义变量,记录反转后的结果
        String reverseStr = "";//默认为空字符串,倒序遍历原有的字符串,然后依次拼接到reverseStr上即可

        //3.判断正负性
        if (num >= 0) {
            //倒序遍历numStr字符串
            char[] chars = numStr.toCharArray();
            for (int i = chars.length - 1; i >= 0; i--) {
                reverseStr += chars[i];
            }
        } else {
            //"-12345"
            numStr = numStr.substring(1);//"12345"
            //倒序遍历numStr字符串
            for (int i = numStr.length() - 1; i >= 0; i--) {
                reverseStr += numStr.charAt(i);
            }

            //"54321"
            reverseStr = "-"+reverseStr;
        }

        //把字符串转换成整数
        long resultLong = Long.parseLong(reverseStr);
        //判断是否超出整型的最大范围
        if (resultLong > Integer.MAX_VALUE || resultLong<Integer.MIN_VALUE){
            return 0;
        }else{
            return (int)resultLong;
        }
    }

}

案例一:两数之和

​ 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以按任意顺序返回答案。

public class Test01 {
    /*
        给定一个整数数组 nums和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。
          
            你可以按任意顺序返回答案。
     */
    public static void main(String[] args) {
        //int[] arr = {1, 4, 2, 3, 0, 5, 3};
        int[] arr = {1, 2, 3, 2, 4, 5, 2, 7, 2};//{0,2}  {1,3} {1,6}  {1,8}   {3,6}  {3,8}  {6,8}
        //int target = 5;//{0,1} {2,3} {4,5} {2,6}   new int[2];
        int target = 4;
        Collection<int[]> cs = find(arr, target);
        for (int[] c : cs) {
            System.out.println(Arrays.toString(c));
        }
    }

    //定义方法完成
    public static Collection<int[]> find(int[] arr, int target) {
        //1.创建集合,用于存储多个数组(满足要求的两个数的索引)
        Collection<int[]> cs = new ArrayList<>();

        //2.遍历数组,得到每一个元素
        for (int i = 0; i < arr.length - 1; i++) {
            //3.拿着当前的元素和数组中其它索引处的元素求和
            for (int j = i + 1; j < arr.length; j++) {
                //如果当前元素和其它元素是同一个元素,则不计算
                /*if (i==j){
                    continue;
                }*/
                int sum = arr[i] + arr[j];
                //4.比对,如果一样,则把对应的两个坐标封装到一个长度为2的数组中,并存储到cs集合中
                if (sum == target) {
                    //两个坐标封装到一个长度为2的数组中,并存储到cs集合中
                    int[] locations = new int[]{i, j};
                    cs.add(locations);
                }
            }
        }

        return cs;
    }


}

案例二:只出现一次的数字

​ 给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素

比如:

​ 输入:nums = [2,2,1] 输出:1

​ 输入:nums = [4,1,2,1,2] 输出:4

​ 输入:nums = [1] 输出:1

public class Test02 {
    /*
        给你一个非空整数数组`nums`,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
        比如:
            输入:nums = [2,2,1]	输出:1
            输入:nums = [4,1,2,1,2]	输出:4
            输入:nums = [1]		输出:1
     */
    public static void main(String[] args) {
        int[] arr = {4, 1, 2, 1, 2};
        System.out.println(findOnce(arr));
    }

    public static int findOnce(int[] arr) {
        //找出arr中只出现一次的元素
        /*
            {4,1,2,1,2}
            1. Map<Integer,Integer>: 元素:出现的次数
            2. 遍历数组,当前元素作为键,次数作为值,存储到Map中
                如果该元素在Map中已经存储了,我把它删掉,如果没有存储,把它存进去
            3.map中剩余的就是出现了一次的元素
         */
        //1.创建map集合
        Map<Integer, Integer> map = new HashMap<>();
        //2.遍历数组,得到每一个元素
        for (int i = 0; i < arr.length; i++) {
            int ele = arr[i];
            //判断在map中,有没有出现键为ele的键值对
            if (map.containsKey(ele)) {
                //如果有,则删除
                map.remove(ele);
            } else {
                //如果没有,则存储
                map.put(ele, 1);
            }
        }
        //3.map中剩余的就是出现了一次的元素
        Set<Integer> keys = map.keySet();
        Optional<Integer> first = keys.stream().findFirst();
        Integer ele = first.get();
        return ele;
    }
}




public class Test02 {
    /*
        给你一个非空整数数组`nums`,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素
        比如:
            输入:nums = [2,2,1]	输出:1
            输入:nums = [4,1,2,1,2]	输出:4
            输入:nums = [1]		输出:1
     */
    public static void main(String[] args) {
        int[] arr = {4, 1, 2, 1, 2};
        /*System.out.println(findOnce(arr));
        show();*/

        System.out.println(findOnce2(arr));
    }

    public static int findOnce(int[] arr) {
        //找出arr中只出现一次的元素
        /*
            {4,1,2,1,2}
            1. Map<Integer,Integer>: 元素:出现的次数
            2. 遍历数组,当前元素作为键,次数作为值,存储到Map中
                如果该元素在Map中已经存储了,我把它删掉,如果没有存储,把它存进去
            3.map中剩余的就是出现了一次的元素
         */
        //1.创建map集合
        Map<Integer, Integer> map = new HashMap<>();
        //2.遍历数组,得到每一个元素
        for (int i = 0; i < arr.length; i++) {
            int ele = arr[i];
            //判断在map中,有没有出现键为ele的键值对
            if (map.containsKey(ele)) {
                //如果有,则删除
                map.remove(ele);
            } else {
                //如果没有,则存储
                map.put(ele, 1);
            }
        }
        //3.map中剩余的就是出现了一次的元素
        Set<Integer> keys = map.keySet();
        Optional<Integer> first = keys.stream().findFirst();
        Integer ele = first.get();
        return ele;
    }

    public static int findOnce2(int[] arr) {
        /*
            {4, 1, 2, 1, 2};
            0对数组中的每个元素做异或操作
               0^出现过一次的元素
         */
        int x = 0;
        for (int i = 0; i < arr.length; i++) {
            x ^= arr[i];
        }
        return x;
    }

    public static void show() {
        // ^: 做位运算的时候,相同位置的值一样,则结果为0,如果相同位置的值不一样,则结果为1
        /*
            0000 0011
          ^ 0000 0100
          ----------------
            0000 0111
         */
        System.out.println(3 ^ 4);

        //1.0和任何数做异或运算,结果是任何值
        //2.某个数字,被其它数字连续做两次异或运算,那么结果是当前的某个数字
        /*
            0000 0000
          ^ 0000 1011
          ------------
            0000 1011
         */
        System.out.println(0 ^ 7);
        System.out.println(0 ^ 8);
        /*
            0000 0010
         ^  0000 0111
         -------------
            0000 0101
         ^  0000 0111
         -------------
            0000 0010

         */
        System.out.println(2 ^ 7 ^ 7);
    }
}

案例三:寻找两个正序数组的中位数

​ 给定两个正序数组 arr1和 arr2,请先合并数组,并找出合并之后数组的 中位数 。

​ 1 2 3 4 5 6 7 8 9 中位数:5

​ 1 2 3 4 5 6 中位数:( 3 + 4 ) / 2

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

public class Test03 {
    /*
        	给定两个正序数组arr1和arr2,请先合并数组,并找出合并之后数组的中位数。
                1 2 3 4 5 6 7 8 9    中位数:5
                1 2 3 4 5 6     	 中位数:( 3 + 4 ) / 2
     */
    public static void main(String[] args) {
        int[] arr1 = {1, 3, 5};
        int[] arr2 = {2, 4, 6, 8, 10, 12,13};

        int[] newArr = merge(arr1,arr2);
        System.out.println(Arrays.toString(newArr));

        //取中位数
        int mid = newArr.length/2;
        if (newArr.length % 2 ==1){
            //长度为奇数
            System.out.println(newArr[mid]);
        }else {
            //长度为偶数
            System.out.println((newArr[mid]+newArr[mid-1])/2.0);
        }
    }

    public static int[] merge(int[] arr1, int[] arr2) {
        //合并
        //1.创建一个新数组,用于存储合并后的元素
        int[] newArr = new int[arr1.length + arr2.length];

        //2.定义两个变量,分别指向arr1和arr2的头部
        int i1 = 0;//arr1的指针
        int i2 = 0;//arr2的指针

        //3.遍历新数组,往新数组的每一个索引处存储元素
        for (int i = 0; i < newArr.length; i++) {
            //i代表新数组的指针,代表往新数组的哪个地方存储
            //4.处理特殊情况: 有没有哪个数组的元素已经存完了
            //判断arr1的元素有没有存储完毕
            if (i1 > arr1.length - 1){
                //arr1的元素存完了
                //把arr2数组的指针指向的元素存储到新数组的i所引处,并且把i2指针向后移动一位
                newArr[i] = arr2[i2++];
                continue;
            }

            //判断arr2的元素有没有存储完毕
            if (i2 > arr2.length-1){
                //arr2的元素存储完毕
                //把arr1数组的指针指向的元素存储到新数组的i所引处,并且把i1指针向后移动一位
                newArr[i] = arr1[i1++];
                continue;
            }

            //5.两个数组的元素都没有存储完毕,因此需要比较两个数组指针指向的元素的大小
            if (arr1[i1] < arr2[i2]){
                //把arr1数组的指针指向的元素存储到新数组的i所引处,并且把i1指针向后移动一位
                newArr[i] = arr1[i1++];
            }else{
                //把arr2数组的指针指向的元素存储到新数组的i所引处,并且把i2指针向后移动一位
                newArr[i] = arr2[i2++];
            }

        }
        return newArr;
    }
}

案例四:最长回文子串

需求:

​ 给你一个字符串 s,找到 s 中最长的回文子串。

​ 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

public class Test04 {

    /*
        需求:
            给你一个字符串 `s`,找到 `s` 中最长的回文子串。
            注意: 如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
     */
    public static void main(String[] args) {
        /*System.out.println(isHuiWen("abc"));
        System.out.println(isHuiWen("aba"));*/
        System.out.println(findBiggestHuiWenString("abcdcefgabcdefggfedcba"));

    }

    //定义方法,求指定字符串的最长回文子串
    public static String findBiggestHuiWenString(String s){
        //求s的最长回文子串
        /*
            "abcdefghejklmnopqabaddabdwx" : 最大回文子串
            1.看字符串本身是不是回文子串
            2.看长度-1的子串是不是回文字符串
            3.看长度-2的子串是不是回文字符串
            4.看长度-3的子串是不是回文字符串
         */
        //1.定义变量,记录子串的长度
        int len = s.length();
        while (true){
            //2.定义变量,记录开始截取的索引以及结束截取的索引
            int begin = 0;
            int end = begin+len;
            //找到s中,所有长度为len的字符串进行判断
            while (true){
                //3.截取子串
                String substring = s.substring(begin, end);

                //4.判断当前子串是不是回文字符串
                if (isHuiWen(substring)){
                    //找到了最大的回文子串
                    return substring;
                }else{
                    //没有找到,继续找
                    begin++;
                    end++;
                    if (end>s.length()){
                        //len长度的字符串全部试验完毕
                        break;
                    }
                }
            }
            //长度-1
            len--;
        }
    }

    //定义方法,判断某个字符串是不是回文字符串: 正着和反着一样
    public static boolean isHuiWen(String str){
        //倒序遍历str,生成一个新的字符串,判断新的字符串和str是不是一样
        String reverseStr = "";
        for (int i = str.length()-1; i>=0; i--){
            reverseStr += str.charAt(i);
        }
        return reverseStr.equals(str);
    }

}

案例五:字符串相加

给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和并同样以字符串形式返回。

你不能使用任何內建的用于处理大整数的库(比如 BigInteger), 也不能直接将输入的字符串转换为整数形式。

public class Test05 {

    /*
        给定两个字符串形式的非负整数num1 和num2,计算它们的和并同样以字符串形式返回。
        注意: 你不能使用任何內建的用于处理大整数的库(比如 BigInteger),也不能直接将输入的字符串转换为整数形式。
     */
    public static void main(String[] args) {
        System.out.println(sum("123","989"));

    }

    public static String sum(String num1,String num2){
        //1.创建3个栈
        Stack<Character> num1S = new Stack<>();
        Stack<Character> num2S = new Stack<>();
        Stack<Character> resultS = new Stack<>();

        //把字符串num1中的字符和num2中的字符压入到对应的栈中
        for (int i = 0; i < num1.length(); i++) {
            num1S.push(num1.charAt(i));
        }
        for (int i = 0; i < num2.length(); i++) {
            num2S.push(num2.charAt(i));
        }
        //2.计算
        //定义一个变量,代表进位
        int residue = 0;
        while (!num1S.isEmpty() || !num2S.isEmpty()){
            //2.0 定义两个变量,用于代表本次做加法的两个字符
            char c1;
            char c2;
            //2.1从num1和num2中弹出元素
            if (num1S.isEmpty()){
                c1='0';
            }else{
                c1 = num1S.pop();
            }

            if (num2S.isEmpty()){
                c2='0';
            }else {
                c2 = num2S.pop();
            }

            //2.2做加法运算
            int result = c1-'0'+c2-'0' +residue;
            if (result>=10){
                //进位
                residue = 1;
                resultS.push((char)(result-10+'0'));//2+'0'=50  '2'---50
            }else{
                //不用进位
                residue = 0;
                resultS.push((char)(result+'0'));
            }
        }
        //考虑最后一次的结果有没有进位
        if (residue==1){
            resultS.push('1');
        }
        //3.把结果栈中的字符,拼接成字符串返回
        String resultNum = "";
        while (!resultS.isEmpty()){
            resultNum += resultS.pop();
        }

        return  resultNum;
    }

}

案例六:字符串中的第一个唯一字符

给定一个字符串 s ,找到第一个在字符串中,只存在一次的字符,并返回它的索引 。如果不存在,则返回 -1 。

比如:

​ 输入: s = “leetcode”
​ 输出: 0

​ 输入: s = “loveleetcode”
​ 输出: 2

​ 输入: s = “aabb”
​ 输出: -1

public class Test06 {
    /*
        给定一个字符串`s`,找到第一个在字符串中,只存在一次的字符,并返回它的索引。如果不存在,则返回`-1`。

            比如:

                输入: s = "leetcode"
                输出: 0

                输入: s = "loveleetcode"
                输出: 2

                输入: s = "aabb"
                输出: -1
     */
    public static void main(String[] args) {
        System.out.println(findFirstOnceChar("leetcode"));
        System.out.println(findFirstOnceChar("loveleetcode"));
        System.out.println(findFirstOnceChar("aabb"));
    }

    public static int findFirstOnceChar(String s) {
        /*
            1.找到当前字符串中的每一个字符
            2.找到当前那字符串中的其它字符进行比较
                如果所有其它字符跟当前字符不一样,找到了
                否则没有找到
         */
        char[] chs = s.toCharArray();
        for (int i = 0; i < chs.length; i++) {
            char c = chs[i];
            //判断当前的字符c在字符数组其它位置有没有出现
            boolean flag = true;//表示当前字符c是否唯一,默认唯一
            for (int j = 0; j < chs.length; j++) {
                //其它字符
                if (i == j) {
                    continue;
                }
                if (c == chs[j]){
                    //c不唯一
                    flag = false;//修改标记位
                    break;
                }
            }
            //如果当前c唯一,则返回索引
            if (flag){
                return i;
            }
        }
        return -1;
    }


}

案例七:数组去重

给你一个非严格递增排列的数组 nums ,请你删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。

元素的相对顺序应该保持 一致 ,返回 nums 中唯一元素的个数。

注意1:不能采取以下思路

​ 创建一个新

数组,遍历老数组得到每一个元素,拿着每一个元素在新数组中判断是否存在,如果存在就舍弃,不存在就添加

注意2:

​ 直接在原数组nums上进行操作

举例:
    nums数组为:0 1 1 2 3 3 3
    在原数组进行去重,打印结果为:
	不重复的元素有4个。
    遍历结果为0 1 2 3

代码示例:

public class Test07 {
    /*
        给你一个非严格递增排列的数组 `nums` ,请你删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。

        注意: 元素的相对顺序应该保持 一致 ,返回 `nums` 中唯一元素的个数。

            注意1:不能采取以下思路
                    创建一个新数组,遍历老数组得到每一个元素,拿着每一个元素在新数组中判断是否存在,如果存在就舍弃,不存在就添加
            注意2:
                    直接在原数组nums上进行操作
     */
    public static void main(String[] args) {
        int[] arr = {1, 2, 2, 3, 3, 3, 4, 5, 6};
        int count = countOnceNumber(arr);
        System.out.println(count);
        System.out.println(Arrays.toString(arr));
    }

    //返回唯一元素的个数
    public static int countOnceNumber(int[] arr) {
        //定义一个变量,记录唯一元素的个数
        int count = 0;
        //定义变量,记录当前判断了多少次
        int count2 = 0;
        //1.遍历数组,找到每一个元素
        for (int i = 0; i < arr.length - 1; i++) {
            //2.判断当前元素和下一个元素是否相等
            if (arr[i] == arr[i + 1]) {
                //3.把后面的元素往前移动一位
                for (int j = i; j < arr.length - 1; j++) {
                    arr[j] = arr[j + 1];
                }
                //当后面的元素移动到前面后, 当前位置的元素还需要再判断一次
                i--;

            } else {
                //证明当前元素唯一
                count++;
            }
            count2++;
            if (count2 >= arr.length - 1) {
                count++;
                break;
            }
        }

        return count;

    }
}



public class Test07 {
    /*
        给你一个非严格递增排列的数组 `nums` ,请你删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。

        注意: 元素的相对顺序应该保持 一致 ,返回 `nums` 中唯一元素的个数。

            注意1:不能采取以下思路
                    创建一个新数组,遍历老数组得到每一个元素,拿着每一个元素在新数组中判断是否存在,如果存在就舍弃,不存在就添加
            注意2:
                    直接在原数组nums上进行操作
     */
    public static void main(String[] args) {
        int[] arr = {1, 2, 2, 3, 3, 3, 4, 5, 6};
        //int count = countOnceNumber(arr);
        int count = countOnceNumber2(arr);
        System.out.println(count);
        System.out.println(Arrays.toString(arr));
    }

    //返回唯一元素的个数
    public static int countOnceNumber(int[] arr) {
        //定义一个变量,记录唯一元素的个数
        int count = 0;
        //定义变量,记录当前判断了多少次
        int count2 = 0;
        //1.遍历数组,找到每一个元素
        for (int i = 0; i < arr.length - 1; i++) {
            //2.判断当前元素和下一个元素是否相等
            if (arr[i] == arr[i + 1]) {
                //3.把后面的元素往前移动一位
                for (int j = i; j < arr.length - 1; j++) {
                    arr[j] = arr[j + 1];
                }
                //当后面的元素移动到前面后, 当前位置的元素还需要再判断一次
                i--;

            } else {
                //证明当前元素唯一
                count++;
            }
            count2++;
            if (count2 >= arr.length - 1) {
                count++;
                break;
            }
        }

        return count;

    }

    public static int countOnceNumber2(int[] arr){
        //1.定义快慢指针
        int p1 = 0;//指向所有唯一元素中最大的那个元素
        int p2 = p1+1;//指向慢指针右侧的第一个元素

        //2.使用用循环,多次移动指针,查找目标元素跟换位置
        while (p2<arr.length){
            //移动p2,找到第一个和p1指向的元素不同的元素
            while (true){
                if (arr[p2] != arr[p1]){
                    //找到了
                    //把p2指向的元素赋值给p1的下一个元素
                    arr[p1+1] = arr[p2];
                    //p1向后移动
                    p1++;
                }else{
                    //没有找到
                    p2++;
                    if (p2 == arr.length){
                        break;
                    }
                }
            }
        }

        //返回唯一元素的个数
        return p1+1;
    }
}

案例八:盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

示例1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例 2:

输入:height = [1,1]
输出:1

代码示例:

public class Test08 {
    /*
        给定一个长度为 `n` 的整数数组arr(数组中的元素都为正数)  。有 `n` 条垂线,第 `i` 条线的两个端点是 `(i, 0)` 和 `(i, arr[i])` 。

        找出其中的两条线,使得它们与 `x` 轴共同构成的容器可以容纳最多的水。

        返回容器可以储存的最大水量。

        说明:你不能倾斜容器。
     */
    public static void main(String[] args) {
        int[] arr = {1, 8, 6, 2, 5, 4, 8, 3, 7};
        //System.out.println(getMax(arr));
        System.out.println(getMax2(arr));
    }

    public static int getMax(int[] arr) {
        //1.定义变量,记录最大的容量
        int max = 0;

        //2.先找到每一条边(找到每个索引对应的元素)
        for (int i = 0; i < arr.length; i++) {

            //3.找到其它的边
            for (int j = i + 1; j < arr.length; j++) {
                //计算两条边可以容纳的容积
                //找到最小的边
                int min = arr[i] < arr[j] ? arr[i] : arr[j];
                //计算容积
                int volume = (j - i) * min;
                if (volume > max) {
                    //修正容积
                    max = volume;
                }

            }
        }

        return max;
    }


    public static int getMax2(int[] arr) {
        /*
            容积 = 底*高

            最大容积: 足够高, 底足够宽

            底: index2-index1
            高: 每个索引处的值
         */
        //0.定义变量,记录最大的容量
        int max = 0;

        //1.定义两个变量,分别指向数组的头部和尾部
        int left = 0;
        int right = arr.length - 1;

        while (left<right) {
            //2.计算left和right代表的边可以组成的容积
            int min = arr[left] < arr[right] ? arr[left] : arr[right];
            int volume = min * (right - left);

            //比对
            if (volume > max) {
                max = volume;
            }

            //3.移动边
            if (arr[right] > arr[left]) {
                //高边是right指向的元素,移动left,让left指向更高的边
                left++;
            } else {
                //高边是left指向的元素,移动right,让right指向更高的边
                right--;
            }
        }

        return max;
    }
}

案例九:插入元素

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

不能使用循环嵌套

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

代码示例:

public class Test09 {
    /*
        给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
        不能使用循环嵌套
     */
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 5, 7, 9};
        System.out.println(calculate(arr,200));

    }

    public static int calculate(int[] arr, int target) {
        //从左往右遍历数组,找一个跟target相同的或者比target大的
        for (int i = 0; i < arr.length; i++) {
            //找到相同的了
            if (arr[i] >= target) {
                return i;
            }
        }

        //需要处理边界值
        return arr.length;
    }
}

案例九:插入元素

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

不能使用循环嵌套

示例 1:

输入: nums = [1,3,5,6], target = 5
输出: 2

示例 2:

输入: nums = [1,3,5,6], target = 2
输出: 1

示例 3:

输入: nums = [1,3,5,6], target = 7
输出: 4

代码示例:

public class Test09 {
    /*
        给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
        不能使用循环嵌套
     */
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 5, 7, 9};
        System.out.println(calculate(arr,200));

    }

    public static int calculate(int[] arr, int target) {
        //从左往右遍历数组,找一个跟target相同的或者比target大的
        for (int i = 0; i < arr.length; i++) {
            //找到相同的了
            if (arr[i] >= target) {
                return i;
            }
        }

        //需要处理边界值
        return arr.length;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2060218.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一分钟带你了解叉车!

一、叉车的概念 叉车是指对整件托盘货物或大件桶装进行装卸、堆垛和短距离运输作业的各种搬运车辆。叉车是实现整件货物和散装物料机械化装卸、堆垛和短途运输的高效率工作车辆。 叉车常用于仓储大型物件的运输、车站、码头、机场、仓库、工地、货厂和工矿企业&#xff0c;是…

【案例47】enq: TX - row lock contention事件导致制单卡死

问题现象 制单时&#xff0c;选择公司就会卡住不动&#xff0c;其他节点正常。 问题分析 通过nmc排查&#xff0c;发现后台有很多制单线程卡住&#xff0c;时间较久&#xff0c;并且当前的事件都是在数据库执行sql层面。并且每条线程的卡住语句都为update语句&#xff0c;怀…

Openstack 与 Ceph集群搭建(中): Ceph部署

文章目录 一、部署前说明1. ceph 版本选择依据2. ceph网络要求3. 硬件要求 二、部署架构三、部署过程1. 通用步骤2. 部署管理节点创建账号安装Cephadm运行bootstrap 3. 登录Ceph web4. 将其他节点加入集群同步ceph key安装ceph CLI命令行添加主机节点到集群添加OSD节点将监控节…

[数据集][目标检测]机械常用工具检测数据集VOC+YOLO格式4713张8类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4713 标注数量(xml文件个数)&#xff1a;4713 标注数量(txt文件个数)&#xff1a;4713 标注…

配置typora上传图片到Chevereto图床

目录 一、下载安装PicGo二、配置PicGo三、配置Typora 一、下载安装PicGo PicGo下载地址点击进入 进入官网后点击下载&#xff0c;会跳转到GitHub,如图,选择对应的操作系统版本下载 下载完成后单击安装&#xff08;本文已windows系统为例&#xff09; 二、配置PicGo 点击插件设…

华为OD机试 - 密码输入检测 字符串

只在本地跑过&#xff0c;不确保一定对 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <string.h>#define setbit(value,bit) (value value |(1<<bit))int main(void) {char buf[201];char out[201];int i 0;int to…

UploadLabs靶场环境

目录 UploadLabs靶场环境 第十八题 第十九题 第二十一题 UploadLabs靶场环境 .php .php. . 第五&#xff0c;十关访问的时候空格必须要使用 %20代替 第七题在linux服务器上的话&#xff0c;文件名如果末尾只存在空格并不会自动删除&#xff0c;还会保留&#xff0c;但是这…

合宙Air700ECQ硬件设计手册——应用接口1

Air700ECQ是一款高度集成的LTE Cat1无线通信模组&#xff0c;基于移芯EC716E平台设计&#xff0c;有着极小的封装和极高的性价比。 它支持移动双模FDD-LTE/TDD-LTE 4G远距离无线传输技术&#xff0c;能够广泛应用于共享设备、定位器、DTU数传等多种场景。 此外&#xff0c;Air7…

2024年互联网公司时薪排行榜大曝光!

2024年互联网公司时薪排行榜重磅出炉&#xff01;这一次&#xff0c;行业薪资数据的透明度前所未有&#xff0c;看完这份榜单&#xff0c;你会发现互联网圈子的贫富差距竟然如此悬殊&#xff0c;不禁让人直呼“酸了”&#xff01; 在这个人人都关注收入与回报的时代&#xff0…

算法之工程化内容(3)—— Docker常用命令

目录 1. 配置docker镜像加速 2. 创建镜像docker-name 3. 查看正在运行的镜像 4. 拉取镜像 5. 运行镜像 6. 停止/启动指定 id 的容器 7. 删除指定 id 的镜像/容器 8. docker发布和部署 (推荐教程&#xff1a;&#x1f69a; 发布和部署 - Docker 快速入门) 1. 配置docke…

CentOS上安装和配置Docker与Docker Compose的详细指南

引言 大家好&#xff0c;我是小阳&#xff0c;在这篇文章中&#xff0c;我将带大家一步步完成在CentOS系统上安装和配置Docker与Docker Compose的过程。通过这篇详细的指南&#xff0c;你将能够轻松配置Docker环境&#xff0c;并在日常开发和部署中享受其带来的便利。 原文阅…

一行一行代码带你阅读,xxljob, 若依vue基础项目,若依vue-plus 项目,实战项目的 视频课程

目录 1 介绍2 地址 1 介绍 本人自己录制的一行一行代码解释源码的课程&#xff0c;适合小白&#xff0c;么有阅读过源码&#xff0c;或者不知道咋阅读源码的小伙伴。 本课程 有&#xff0c;视频&#xff0c;笔记&#xff0c;加了注释的源码 2 地址 1 实战课程 本课程 有&am…

拓客工具,助你多维度筛选客源!

随着大数据与人工智能技术的飞速发展&#xff0c;企业拓客的方式也迎来了前所未有的变革。在这里将分享如何利用拓客工具&#xff0c;在任意行业中精实现高效拓客。 一、高级搜索&#xff1a;最新企业&#xff01; 传统的客户开发方式往往依赖于广撒网式的营销手段&#xff0c;…

Linux系统-打包重定向/管道符/进程shell脚本

打包、解包、压缩、解压缩命令 统一使用tar命令&#xff0c;根据不同的参数完成不同的操作 语法&#xff1a;tar 参数 打包后的文件(只能是一个) 需要打包的文件或目录(可以是多个&#xff0c;空格分开即可) 常见的打包压缩格式&#xff1a; 打包后的文件后缀名&#xff1a;…

Linux——网络(1)

一、IPC&#xff08;进程间通信方式&#xff09; IPC&#xff1a;Inter Process Communication 共享内存&#xff08;最高效的进程间通信方式&#xff09; 虚拟地址 mmu(memory management unit ) 共享内存: 1.是一块&#xff0c;内核预留的空间 2.最高效的…

攻击手法罕见!ESET披露最新网络钓鱼活动,专门针对Android、iPhone用户

ESET 研究人员发现了一种罕见的网络钓鱼活动&#xff0c;专门针对 Android 和 iPhone 用户。他们分析了一个在野外观察到的案例&#xff0c;该案例主要是针对一家著名的捷克银行的客户。 值得注意的是这种攻击主要是从第三方网站安装钓鱼应用程序&#xff0c;而无需用户主动安…

东方博宜OJ 训练计划:前缀和、差分 习题集

前缀和、差分 听到这个名字&#xff0c;大家一定感觉不陌生吧&#xff0c;毕竟学过动态规划的人大部分 都知道&#xff0c;那我就简单介绍一下&#xff0c;并奉上习题供大家参考&#xff01; 题目描述我就不放了&#xff0c;根据题号参见 东方博宜OJ 东方博宜OJ 网址&#xf…

【2024国赛速成系列】建模手三天必成计划

内容来自https://www.bilibili.com/video/BV14M4m1y77t 目录 一、第一天 1、常见模型分类 2、两大学习神器 &#xff08;1&#xff09;SPSSPRO &#xff08;2&#xff09;ChatGPT 二、第二天 三、第三天 一、第一天 建模手在最开始需要了解模型分类及国赛常见模型的用法…

专利有哪几种类型?

专利有哪几种类型&#xff1f;

高并发登录模块

1. 配置⼀主⼆从mysql57 1. mycat对mysql8不完全⽀持 2. mysql8主从问题不⼤ get_pub_key1 1. gtids事务复制 2. 删除/etc/my.cnf 3. 同步data⽂件需要先停⽤mysql服务&#xff0c;删除data⽬录中的 auto.cnf 4. gtid模式以及经典模式都需要锁表 flush tables with read …