栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

剑指offerDayN

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指offerDayN

今天没有好好学习呢,补习了一下java的基础知识类似于break,comparator

  • 数组组合成最小的数字
    package offer;
    
    import java.lang.reflect.Array;
    import java.util.Arrays;
    import java.util.Comparator;
    
    
    public class Test21 {
        
        public static String numberMin(int[] arr) {
            //判空数组
            if (arr.length == 0 || arr == null)
                return null;
            //先把数组的内容 转换成字符串
            //定义一个字符串数组存储
            String[] str = new String[arr.length];
            for (int i = 0; i < arr.length; i++) {
                str[i] = String.valueOf(arr[i]);
            }
            //比较器 字符串的o1+o2 与o2+o1不一样
            Arrays.sort(str, new Comparator() {
                @Override
                public int compare(String o1, String o2) {
                    return (o1 + o2).compareTo(o2 + o1);
                }
            });
            //已经排好序列了
            //把字符串数组的内容放进StringBuffer
            StringBuffer sb = new StringBuffer();
            for (String s : str) {
                sb.append(s);
            }
            return sb.toString();
        }
    
        
        public static String numberMin2(int[] arr) {
            //判空
            if (arr.length == 0 || arr == null)
                return null;
            //数字转换成字符串
            //建字符串数组
            String[] str = new String[arr.length];
            for (int i = 0; i < arr.length; i++) {
                str[i] = String.valueOf(arr[i]);
            }
            //进行快排
            quickSort(str, 0, arr.length - 1);
            //以StringBuffer形式输出
            StringBuffer sb = new StringBuffer();
            for (String s : str) {
                sb.append(s);
            }
            return sb.toString();
        }
    
        public static void quickSort(String[] str, int left, int right) {
            if (right <= left) {
                return;
            }
            //快速排序 不是二分查找
            // 三个指针
            int i = left;
            int j = right;
            String temp = str[left];
            //两个指针不相遇 则一次循环没有出结果
            while (i < j) {
                //str[j] > = temp 两个字符串的比较
                while ((str[j] + temp).compareTo(temp + str[j]) >= 0 && i < j)
                    j--;
                while ((str[i] + temp).compareTo(temp + str[i]) <= 0 && i < j)
                    i++;
                //走到应该替换字符的位置
                String s = str[i];
                str[i] = str[j];
                str[j] = s;
            }
            //交换一次要将中间数值与初始节点交换
            str[left] = str[j];
            //更改基准的数值
            str[j] = temp;
            quickSort(str, left, i - 1);
            quickSort(str, j + 1, right);
        }
    
        public static void main(String[] args) {
            int[] arr = {10, 2};
            System.out.println(numberMin2(arr));
        }
    }
    

    简简单单的一道题发现自己有太多的不会了

  • 存在的问题 1数字转字符2比较器3为什么选用字符串输出

  • 数组中一个数存在的次数

    package offer;
    
    import java.util.HashMap;
    import java.util.Map;
    
    
    public class Test22 {
        public static int countSame(int[] arr, int val) {
            HashMap map = new HashMap<>();
            for (int i : arr) {
                int count = map.getOrDefault(i, 0);
                count++;
                map.put(i, count);
            }
            return map.get(val);
        }
    
        
        public static int countSame2(int[] arr, int val) {
            //先写二分查找
            //按照数组长度改进
            int low = 0, high = arr.length - 1;
            //记录相同元素数组长度
            int numK = 0;
            while (low <= high) {
                int mid = low + (high - low) / 2;
                //查找的数组正好是 123 3 345
                if (arr[mid] == val) {
                    numK++;
                    int midR = mid + 1;
                    int midL = mid - 1;
                    while (midR <= arr.length - 1 && arr[midR] == val) {
                        numK++;
                        midR++;
                    }
                    while (midL >= 0 && arr[midL] == val) {
                        numK++;
                        midL--;
                    }
                    return numK;
                }
                //往左去看左边有么
                else if (arr[mid] < val)
                    low = mid + 1;
                else
                    high = mid - 1;
            }
            return -1;
        }
    
        public static void main(String[] args) {
            int[] arr = {1, 2, 3, 3, 3, 3, 4, 5};
            int map = countSame2(arr, 3);
            System.out.println(map);
        }
    }
    

能开始写一点点代码了,知道了思路之后能写出来了,但是在细节实现方面还是不行,加油啊骚年

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975587.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号