java算法题收集

1. 10亿个数字里里面找最小的10个

import java.util.Random;

public class Test1 {

    static Random random = new Random();

    public static void main(String[] args) {
        /**第一个元素0不参与,只是用于占位置,这样的话,只要array[k]>array[2k] && array[k]>array[2k+1]那就是最大堆了,
         * 此外,这里暂时用20个数代替1亿个
         */
        int[] array = new int[100000000];
        for (int i = 0; i < 100000000; i++) {
            int tempNum = random.nextInt(Integer.MAX_VALUE);
            array[i] = tempNum;
        }

        long st = System.currentTimeMillis();
        //建立建立节点个数为10的最大堆
        for (int i = 10 / 2; i >= 1; i--) {
            adjustHeap(array, i, 10);
        }
        for (int i = 11; i < array.length; i++) {
            //如果这个元素小于堆顶,和堆顶交换,然后重新调整堆
            if (array[i] < array[1]) {
                swap(array, i, 1);
                adjustHeap(array, 1, 10);
            }
        }

        long et = System.currentTimeMillis();
        System.out.println("用时:" + (et - st) + "ms");
        System.out.println("最小的10个数字为:");
        for (int i = 1; i <= 10; i++) {
            System.out.print(array[i] + " ");
        }
    }

    /**
     * 交换
     */
    private static void swap(int[] array, int i, int j) {
        int tem = array[i];
        array[i] = array[j];
        array[j] = tem;
    }

    /**
     * 在以array[head]为根的左右子树是最大堆的前提下把以array[head]为根的树调整为最大堆
     */
    static void adjustHeap(int[] array, int head, int tail) {
        int root = array[head];
        int i = 2 * head;
        while (i <= tail) {
            int max = array[i];
            if (i + 1 <= tail) {
                if (array[i + 1] > array[i]) {
                    max = array[i + 1];
                    i++;
                }
            }
            if (root > max) {
                break;
            } else {
                array[i / 2] = array[i];
            }
            i *= 2;
        }
        array[i / 2] = root;
    }
}

2. 有1亿个数字,其中有2个是重复的,快速找到它,时间和空间要最优

public class Test1 {

    public static void main(String[] args) {
        //1亿长度
        int[] arr = new int[100000000];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = i + 1;
        }
        arr[99999999] = 2020;

        long st = System.currentTimeMillis();

        int min = arr[0];
        int max = arr[0];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] < min) {
                min = arr[i];
            }
            if (arr[i] > max) {
                max = arr[i];
            }
        }
        byte[] bucket = new byte[(max - min) / 8 + 1];
        for (int i = 0; i < arr.length; i++) {
            int num = arr[i];
            int j = (num - min) / 8;
            int k = (num - min) % 8;
            if (((bucket[j] >> k) & 1) > 0) {
                //重复了
                System.out.println("Number of repeats:" + num);
                break;
            } else {
                bucket[j] |= (1 << k);
            }
        }
        long et = System.currentTimeMillis();
        System.out.println("用时:" + (et - st) + "ms");
    }

}

3. 字符串反转

public class Test1 {

    public static void main(String[] args) {
        System.out.println(reverse("hello java"));
    }

    public static String reverse(String str) {
        char[] newStr = new char[str.length()];

        //循环字符串长度的1/2.
        for (int i = 0; i < str.length() / 2; i++) {
            newStr[i] = str.charAt(str.length() - i - 1);
            newStr[str.length() - i - 1] = str.charAt(i);
        }
        return new String(newStr);
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值