01-常见算法

选择排序  
冒泡排序 
折半查找  

斐波那契数列 
水仙花数  
杨辉三角  
交换二个数的三种方法  

模拟一个栈  
二进制中一个数的相反数的表示 

2^n-1的二进制特点是:所有位数都为1

一.排序

1.选择排序

    private static void selectSort(int[] targetArr){
        for(int i=0; i<targetArr.length-1;i++){
            for(int j=i+1; j<targetArr.length; j++){
                if (targetArr[i]>targetArr[j]) {
                    int temp = targetArr[i];
                    targetArr[i] = targetArr[j];
                    targetArr[j] = temp;
                }
            }
        }
    }

2.冒泡排序

    private static void bubbleSort(int[] targetArr){
        for(int i=0;i<targetArr.length;i++){
            for(int j=0;j<targetArr.length-1-i;j++){
                if (targetArr[j]>targetArr[j+1]) {
                    int temp = targetArr[j];
                    targetArr[j] = targetArr[j+1];
                    targetArr[j+1] = temp;
                }
            }
        }
    }

3.折半查找

    /**
     * 折半查找:查找目标元素在已经去重排序的数组当中的位置索引,如果没有查找到返回-1
     * 折半查找传入的数组是要求已经排序的
     * @param target
     * @param arr
     * @return
     */
    private static int halfSearch(int target, int[] arr){
        int start = 0;
        int end = arr.length;
        while(start<end){
            int midIndex = (start+end)/2;
            if (target==arr[midIndex]) {
                return midIndex;
            }else if(target<arr[midIndex]){
                end = midIndex;
            }else {
                start = midIndex;
            }
        }
        return -1;
    }

二.斐波那契数列 (又称兔子数列)

    /**
     * 输出指定n的斐波那契数组
     * @param fnArr 
     * @param n
     * @return result
     */
    private static int[] fibonacciSequeue(int[] fnArr, int n){
        if (n<=0) {
            throw new IllegalArgumentException("参数错误:n必须是大于0的整数");
        }
        if (fnArr==null) {
            fnArr = new int[n];
        }
        int fn;
        if (n==1||n==2) {
            fn = 1;
        }else {
            fn=fibonacciSequeue(fnArr, n-1)[n-2]+fibonacciSequeue(fnArr, n-2)[n-3];
        }
        fnArr[n-1]=fn;
        return fnArr;
    }

三.求出水仙花数

    /**
     * 求出水仙花数
     * 水仙花数:个位、十位、百位 各位数的立方和等于自身的三位数
     */

    private static void narcissisticNumber(){
        for(int i=100; i<1000; i++){
            int ge = i%10;
            int shi = i/10%10;
            int bai = i/10/10;
            if (ge*ge*ge+shi*shi*shi+bai*bai*bai==i) {
                System.out.println(i);
            }
        }
    }

四.杨辉三角

    /**
     * 输出杨辉三角的第n行
     * @param n
     * @return
     */
    private static int[] pascalTriangle(int n){
        if (n<0) {
            throw new IllegalArgumentException("参数错误:n必须是大于0的整数");
        }
        int[] arr = new int[n];
        if (n==1) {
            arr[0]=1;
        }else if(n==2){
            arr[0]=1;
            arr[1]=1;
        }else{
            arr[0]=1;
            arr[n-1]=1;
            int [] tempArr = pascalTriangle(n-1);
            for(int i=0; i<tempArr.length-1; i++){
                arr[i+1]=tempArr[i]+tempArr[i+1];
            }
        }
        return arr;
    }

五.交换二个数

    public class SwapTwoNum {
        static int a =15;
        static int b =20;

        public static void main(String[] args) {
            method1();
            System.out.println("method1----->a="+a+",b="+b);

            method2();
            System.out.println("method2----->a="+a+",b="+b);

            method3();
            System.out.println("method3----->a="+a+",b="+b);
        }
        /**
         * 不使用中间变量
         */
        private static void method2(){
            a = a+b;
            b = a-b;
            a = a-b;
        }
        /**
         * 使用中间变量
         */
        private static void method1( ){
            int temp =a;
            a = b;
            b = temp;
        }
        /**
         * 不使用中间变量,效率最高,位运算
         */
        private static void method3( ){
            a = a^b;
            b = a^b;
            a = a^b;
        }
    }

六.模拟一个栈

    /**
     * 模拟栈
     * @author lqs
     */
    public class MockStack {
        LinkedList<Object> list = new LinkedList<>();
        /**
         * 压栈
         * @param obj
         * @return
         */
        public Object push(Object obj){
            list.add(obj);
            return obj;
        }
        /**
         * 弹栈
         * @return
         */
        public Object pop(){
            return list.removeLast();
        }
        /**
         * 获取栈顶的但不移除
         * @return
         */
        public Object peek(){
            return list.getLast();
        }
        public int size(){
            return list.size();
        }
        public boolean isEmpty(){
            return list==null? true:list.size()<0;
        }
        public int search(Object obj) {
            int index = list.lastIndexOf(obj);
            if (index >= 0) {
                return size() - index;
            }
            return -1;
        }
        public static void main(String[] args) {
            MockStack mockStack = new MockStack();
            mockStack.push(1);
            mockStack.push(2);
            mockStack.push(3);
            mockStack.push(4);
            mockStack.push(5);
            System.out.println(mockStack.pop());
            System.out.println("size="+mockStack.size());

            System.out.println(mockStack.pop());
            System.out.println("size="+mockStack.size());

            System.out.println(mockStack.pop());
            System.out.println("size="+mockStack.size());

            System.out.println(mockStack.pop());
            System.out.println("size="+mockStack.size());
        }
    }

七. 求一个数的相反数

八. 2^n-1的二进制特点是:从低到高位有值 位数都为1

例如:

2^2=4    2^2-1=3    二进制为    00000011  
2^3=8    2^3-1=7    二进制为    00000111  
2^4=16  2^4-1=15 二进制为 00001111

Last updated

Was this helpful?