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

19.算法

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

19.算法

算法
  • 1.冒泡排序
  • 2.二分查找法
  • 3.插入排序
  • 4.选择排序
  • 5.数据里有{1,2,3,4,5,6,7,8,9},请随机打乱顺序,生成一个新的数组(请以代码实现)
  • 6.一个问题的最优解是什么意思
  • 7.如何不用额外变量交换两个数
  • 8.一个数组中只有一个出现了奇数次的数,找出这个数
  • 9.提取整形数最右侧的1
  • 10.一个数组中出现奇数次的两个数,其它数都是偶数次。
  • 11.统计一个数的二进制里有多少个1
  • 12.红黑树的性质:
  • 13.手写双向链表
  • 14.手写一个ArrayList

1.冒泡排序
//1.冒泡排序
public static int[] bubbleSort(int[] arr){
    int temp;
    //用来控制比较的次数为数组长度-1次
    for (int j = 0; j arr[i+1]){
                temp=arr[i];
                arr[i]=arr[i+1];
                arr[i+1]=temp;
            }
        }
    }
    return arr;
}
2.二分查找法
public static int binarySearch(int a,int[] arr){
    int start=0;
    int end=arr.length-1;
    while(start<=end){
        //防止int溢出,所以才不用(end+start)/2
        int mid=start+(end-start)/2;
        if(a==arr[mid]){
            return mid;
        }else if(a 
3.插入排序 
public static int[] insertSort(int[] arr){
    //从数组的第二个数开始插入
    for (int i = 1; i <=arr.length-1 ; i++) {
        int tmp=arr[i];
        //第一个要插入的位置
        int index=i-1;
        while(index>=0&&tmp 
4.选择排序 
public static void selectionSort(int[] arr){
    //如果数组为空或者数组长度小于2,直接退出方法
    if(arr==null||arr.length<2){
        return;
    }
    for (int i = 0; i  
5.数据里有{1,2,3,4,5,6,7,8,9},请随机打乱顺序,生成一个新的数组(请以代码实现) 
public static int[] srand(int arr[]){
    int b[]=new int[arr.length];
    for (int i = 0; i  
6.一个问题的最优解是什么意思 

一般情况下,解决一个问题的算法流程,在时间复杂度的指标上,一定要尽可能的低,先满足了时间复杂度最低这个指标之后,使用最少的空间的算法流程,叫这个问题的最优解。
一般说最优解是忽略掉常数项这个因素的,因为这个层次只决定了实现层次的优化和考虑,而和怎么解决这个问题的思想无关。

7.如何不用额外变量交换两个数
public static boolean swap(int arr[],int i,int j){
    //这种交换必须满足一个条件,交换的两个数不能指向同一个内存地址.
    //因为交换相当于两个容器里东西交换,如果只有1个容器谈何交换.
    //所以对于数组而言,下标i和j不能相等.
    if(i!=j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
        return true;
    }
    return false;
}
8.一个数组中只有一个出现了奇数次的数,找出这个数

思路:异或运算满足交换律和结合律。根据N^N=0 0^N=N 出现偶数次的数最后异或后肯定为0,如果只有1个出现奇数次的数,那最后数组所有元素的异或运算就是这个奇数的值。

public static void printOddTimesNum(int[] arr){
    int eor=0;
    for (int i = 0; i n&(~n+1)

public static void main(String[] args) {
    //随机来个偶数,因为奇数的个位数肯定是1
    int a=((int)(Math.random()*500000))<<1;
    //提取整数最右侧的1
    int b=a&(~a+1);
    System.out.println(a);
    System.out.println(Integer.toBinaryString(a));
    System.out.println(Integer.toBinaryString(b));
}
10.一个数组中出现奇数次的两个数,其它数都是偶数次。
public static void printOddTimesNum2(int[] arr){
    int eor=0;
    for (int i = 0; i  f=first;
        for (int i = 0; i <= length-1; i++) {
            sb.append(f.elemnt+",");
            f=f.next;
        }
        sb.deleteCharAt(sb.length()-1);
        sb.append("}");
        return sb.toString();
    }
    public static void main(String[] args) {
        MylinkedList list = new MylinkedList<>();
        list.add("小明");
        list.add("小李");
        list.add("小王");
        list.add("小程");
        list.add("小宋");
        list.add("小黄");
        list.add("小刘");
        list.add("小高");
        System.out.println(list.get(5));
        System.out.println(list.toString());
    }
}
 
14.手写一个ArrayList 
package com.zcc.juc;

import java.util.*;
import java.util.function.Consumer;

public class MyArrayList {
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA={};
    private static final Object[] EMPTY_ELEMENTDATA={};
    private static final int DEFAULT_CAPACITY = 10;
    private Object[] elementData;
    private int size;
    protected transient int modCount = 0;

    //如果是无参创建
    public MyArrayList(){
        this.elementData=DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    //如果有参创建
    public MyArrayList(int initialCapacity){
        if(initialCapacity>0){
            elementData=new Object[initialCapacity];
        }else if(initialCapacity==0){
            elementData=EMPTY_ELEMENTDATA;
        }else{
            throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
        }
    }

    public boolean add(E e){
        ensureCapacityInternal(size+1);
        elementData[size++]=e;
        return true;
    }

    public E remove(int index){
        //先判断要删除的索引是否过界
        if(index>=size)
            throw new IndexOutOfBoundsException();

        modCount++;

        E oldElement = get(index);
        int numMoved=size-index-1;

        System.arraycopy(elementData,index+1,elementData,index,numMoved);

        elementData[--size]=null;
        return oldElement;

    }

    public E get(int index){
        //先判断要删除的索引是否过界
        if(index>=size)
            throw new IndexOutOfBoundsException();
        return (E)elementData[index];
    }

    private void ensureCapacityInternal(int minCapacity) {
        //先判断elementData是不是还是默认的数组
        if(elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA){
            minCapacity=DEFAULT_CAPACITY;
        }
        modCount++;
        //如果要求最小容量减去数组长度>0就要扩容
        if(minCapacity-elementData.length>0){
            grow(minCapacity);
        }
    }

    //扩容
    private void grow(int minCapacity) {
        //旧数组长度
        int oldCapacity=elementData.length;
        //新数组长度为原来的1.5倍
        int newCapacity=oldCapacity+(oldCapacity>>1);
        //如果是初始化数组长度的话 新数组长度就=要求最小长度
        if(newCapacity-minCapacity<0){
            newCapacity=minCapacity;
        }
        elementData= Arrays.copyOf(elementData,newCapacity);
    }
    private class Itr implements Iterator{
        int cursor;
        int lastRet=-1;
        int expectedModCount=modCount;

        public Itr() {
        }

        @Override
        public boolean hasNext() {
            return cursor!=size;
        }

        @Override
        public E next() {
            checkForModification();
            int i=cursor;
            //如果游标大于等于数组长度就抛出异常
            if(i>=size){
                throw new NoSuchElementException();
            }
            Object[] elementData = MyArrayList.this.elementData;
            //如果游标大于数组的长度
            if(i>=elementData.length){
                throw new ConcurrentModificationException();
            }
            cursor=i+1;
            return (E)elementData[lastRet=i];
        }


        @Override
        public void remove() {
            if (lastRet < 0)
                throw new IllegalStateException();
            checkForModification();
            try {
                MyArrayList.this.remove(lastRet);
                cursor = lastRet;
                lastRet = -1;
                expectedModCount = modCount;
            } catch (IndexOutOfBoundsException ex) {
                throw new ConcurrentModificationException();
            }
        }

        //
        private void checkForModification() {
            if(expectedModCount!=modCount){
                throw new ConcurrentModificationException();
            }
        }

    }
    @Override
    public String toString() {
        Iterator it=new Itr();
        if (! it.hasNext())
            return "[]";

        StringBuilder sb = new StringBuilder();
        sb.append('[');
        for (;;) {
            E e = it.next();
            sb.append(e == this ? "(this Collection)" : e);
            if (! it.hasNext())
                return sb.append(']').toString();
            sb.append(',').append(' ');
        }
    }
}

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

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

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