• leetcode-數組篇


    Remove Element

    public class Lc27 {
        public static int removeElement(int[] nums, int val) {
    
            if (nums == null || nums.length == 0) {
                return 0;
            }
    
            int count = 0;
            for (int i = 0; i < nums.length;) {
                if (nums[i] == val) {
                    count++;
                    move(nums, i);
                } else {
                    i++;
                }
            }
            return nums.length - count;
        }
    
        public static void move(int[] nums, int position) {
            for (int i = position; i < nums.length - 1; i++) {
                nums[i] = nums[i + 1];
            }
            nums[nums.length - 1] = Integer.MAX_VALUE;
        }
    
        public static void main(String[] args) {
            int[] nums = { 0, 1, 2, 2, 3, 0, 4, 2 };
            int val = 2;
            System.out.println(removeElement(nums, val));
        }
    }

    Remove Duplicates from Sorted Array,这里用了六种排序,由于题目中有负数导致基数排序可能会出现数组下标错误

    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 俩个排序算法
     *
     */
    public class Lc26 {
    
        public static int removeDuplicates(int[] nums) {
            int count = 0;
            for (int i = 0; i < nums.length - 1; i++) {
                if (nums[i] == nums[i + 1]) {
                    nums[i] = Integer.MAX_VALUE;
                    count++;
                }
            }
    //        nums = insertSort(nums);
    //        nums = shellSort(nums);
    //        nums = selectSort(nums);
    //        nums = bubbleSort(nums);
    //        quickSort(nums, 0, nums.length - 1);
            nums = radixSort(nums);
    
            return nums.length - count;
        }
    
        /**
         * 插入排序,遍历所有的元素和以前排好的元素,如果选择的元素比以前的元素小就替换。
         */
        public static int[] insertSort(int[] nums) {
            for (int i = 1; i < nums.length; i++) {
                for (int j = 0; j < i; j++) {
                    if (nums[i] < nums[j]) {
                        int temp = nums[i];
                        nums[i] = nums[j];
                        nums[j] = temp;
                        break;
                    }
                }
            }
            return nums;
        }
    
        /**
         * 插入排序,遍历所有的元素和以前排好的元素,如果选择的元素比以前的元素小就替换。 希尔排序:在插入排序的基础上增加控制增量,逻辑分组数据,每次比较俩端数据
         */
        public static int[] shellSort(int[] nums) {
            for (int gap = nums.length / 2; gap > 0; gap /= 2) {
                for (int i = gap; i < nums.length; i++) {
                    for (int j = i; j >= gap; j -= gap) {
                        if (nums[j] < nums[j - gap]) {
                            int temp = nums[j];
                            nums[j] = nums[j - gap];
                            nums[j - gap] = temp;
                        }
                    }
                }
            }
            return nums;
        }
    
        /**
         * 选择排序:再要排序中的数组中,选出最小的数字和第一个数字替换,一次选出第二小的数组和第二个数字替换,一次类推
         */
        public static int[] selectSort(int[] nums) {
            for (int i = 0; i < nums.length; i++) {
                int index = nums[i];
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[j] < nums[i]) {
                        int temp = nums[j];
                        nums[j] = nums[i];
                        nums[i] = temp;
                    }
                }
            }
            return nums;
        }
    
        /*
         * 冒泡排序:对当前还未排好顺序的元素进行自顶向下排序,交换相邻的俩个数字,小数上浮,大数下沉
         */
        public static int[] bubbleSort(int[] nums) {
            for (int i = 0; i < nums.length; i++) {
                for (int j = i + 1; j < nums.length; j++) {
                    if (nums[j] < nums[i]) {
                        int temp = nums[j];
                        nums[j] = nums[i];
                        nums[i] = temp;
                    }
                }
            }
            return nums;
        }
    
        /**
         * 快速排序:选取一个基准值,利用二分法对其排序
         */
        public static void quickSort(int[] nums, int low, int hign) {
            if (low < hign) {
                int index = getIndex(nums, low, hign);
                quickSort(nums, 0, index - 1);
                quickSort(nums, index + 1, hign);
            }
        }
    
        private static int getIndex(int[] nums, int low, int hign) {
            int temp = nums[low];
            while (low < hign) {
                while (low < hign && nums[hign] >= temp) {
                    hign--;
                }
                nums[low] = nums[hign];
    
                while (low < hign && nums[low] <= temp) {
                    low++;
                }
                nums[hign] = nums[low];
            }
            nums[low] = temp;
            return low;
        }
    
        /**
         * 基数排序:低位优先,比较每个数字的低位,依次到高位,注意是正整数
         */
        public static int[] radixSort(int[] nums) {
            if (nums == null || nums.length == 0) {
                return nums;
            }
            int max = nums[0];
            for (int i = 0; i < nums.length; i++) {
                if (max < nums[i]) {
                    max = nums[i];
                }
            }
    
            int digit = 0;
            while (max != 0) {
                max /= 10;
                digit++;
            }
    
            // init list
            List<List<Integer>> buckets = new ArrayList<List<Integer>>();
            for (int i = 0; i < 10; i++) {
                buckets.add(new ArrayList<>());
            }
    
            for (int i = 0; i < digit; i++) {
                for (int j = 0; j < nums.length; j++) {
                    int key = (int) (nums[j] % Math.pow(10, i + 1) / Math.pow(10, i));
                    buckets.get(key).add(nums[j]);
                }
                int count = 0;
                for (int j = 0; j < nums.length; j++) {
    
                    while (buckets.get(j).size() > 0) {
                        nums[count++] = buckets.get(j).remove(0);
                    }
                }
                // 分配完之后,将桶中的元素依次复制回数组
            }
            return nums;
        }
    
        public static void main(String[] args) {
            int[] nums = { -1, 0, 0, 0, 0, 3, 3 };
            System.out.println(removeDuplicates(nums));
        }
    
    }
     

    Remove Duplicates from Sorted Array II

    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    public class Lc80 {
        public static int removeDuplicates(int[] nums) {
    
            // map(数字/次数)
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            int count = 0;
            for (int i = 0; i < nums.length; i++) {
                if (map.containsKey(nums[i])) {
                    int temp = map.get(nums[i]);
                    if (temp >= 2) {
                        count++;
                        nums[i] = Integer.MAX_VALUE;
                    } else {
                        map.put(nums[i], ++temp);
                    }
                } else {
                    map.put(nums[i], 1);
                }
            }
    
            Arrays.sort(nums);
            return nums.length - count;
        }
    
        public static void main(String[] args) {
            int[] nums = { 1, 1, 1 };
            System.out.println(removeDuplicates(nums));
        }
    }
     

    Find the Celebrity

     

    Rotate Array

    public class Lc189 {
        public static void rotate(int[] nums, int k) {
            int previous = 0;
            for (int i = 0; i < k; i++) {
                previous = nums[nums.length - 1];
                for (int j = 0; j < nums.length; j++) {
                    int temp = previous;
                    previous = nums[j];
                    nums[j] = temp;
                }
            }
        }
    
        public static void main(String[] args) {
            int[] nums = { 1, 2, 3, 4, 5, 6, 7 };
            int k = 3;
            rotate(nums, k);
        }
    
    }
     

    First Missing Positive

    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    public class Lc41 {
        public static int firstMissingPositive(int[] nums) {
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            for (int i = 0; i < nums.length; i++) {
                if (map.containsKey(nums[i])) {
                    nums[i] = Integer.MAX_VALUE;
                } else {
                    map.put(nums[i], i);
                }
            }
    
            Arrays.sort(nums);
            int min = 0;
            int minPosition = 0;
            for (int i = 0; i < nums.length; i++) {
                if (nums[i] > 0) {
                    minPosition = i;
                    min = nums[i];
                    break;
                }
            }
            if (min != 1) {
                return 1;
            }
    
            int j = 1;
            for (int i = minPosition; i < nums.length; i++, j++) {
                if (nums[i] != j) {
                    return j;
                }
            }
            return j;
    
        }
    
        public static void move(int[] nums, int position) {
            for (int i = 0; i < nums.length - 1; i++) {
                nums[i] = nums[i + 1];
            }
            nums[nums.length - 1] = Integer.MAX_VALUE;
        }
    
        public static void main(String[] args) {
            int[] nums = { 0, 2, 2, 1, 1 };
            System.out.println(firstMissingPositive(nums));
        }
    }
     

    Bulls and Cows

    import java.util.ArrayList;
    import java.util.List;
    
    public class Lc229 {
        public static String getHint(String secret, String guess) {
            int bulls = 0;
            int cows = 0;
            List<String> secretDigits = convertToAscall(secret);
            List<String> guessDigits = convertToAscall(guess);
            for (int i = 0; i < secretDigits.size(); i++) {
                if (secretDigits.get(i).equals(guessDigits.get(i))) {
                    bulls++;
                } else {
                    cows++;
                }
            }
            return bulls + "A" + cows + "B";
    
        }
    
        private static List<String> convertToAscall(String s) {
            StringBuffer sb = new StringBuffer();
            char[] chars = s.toCharArray();
            for (char c : chars) {
                sb.append((int) c).append(",");
            }
            String[] str = sb.toString().split(",");
            List<String> lists = new ArrayList<>();
            for (String string : str) {
                lists.add(string);
            }
    
            return lists;
        }
    
        public static void main(String[] args) {
            String secret = "1123";
            String guess = "0111";
            System.out.println(getHint(secret, guess));
        }
    }

     参考文档:https://cspiration.com/leetcodeClassification#10309

     
  • 相关阅读:
    Html5新特性之文档声明和头部信息
    HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)
    转:如何进行软件架构设计?
    sql2008,sa不能使用:不能为主体 sa 中设置凭据
    用VS2012不能打开VS2010的项目
    解决sourcesafe admin用户自动登录并且不用密码的问题
    WIN7隐藏GUEST登录账户
    人人刷人气
    python文件操作
    sigmoid belief network boltszmann machine
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/11971239.html
Copyright © 2020-2023  润新知