1. 程式人生 > >劍指Offer(21-30)

劍指Offer(21-30)

不存在 system () emp integer 結構 bre 題目 length

題21:包含min函數的棧

題目:定義棧的數據結構,請在該類型中實現一個能夠得到棧的最小元素的min函數。在該棧中,調用min,push及pop的時間復雜度都是O(1).

public class Main{
    private MyStack<Integer> minStack = new MyStack<>();
    private MyStack<Integer> dataStack = new MyStack<>();

    public void push(Integer item){
        dataStack.push(item);
        if(minStack.length == 0 || item<=minStack.head.data){
            minStack.push(item);
        }else{
            minStack.push(minStack.head.data);
        }
    }
    public Integer pop(){
        if(dataStack.length == 0 || minStack.length == 0){
            return null;
        }
        minStack.pop();
        return dataStack.pop();
    }
    public Integer min(){
        if(minStack.length == 0){
            return null;
        }
        return minStack.head.data;
    }
    public static void main(String[] args){
        E21MinInStack test = new E21MinInStack();
        test.push(3);
        test.push(2);
        test.push(1);
        System.out.println(test.pop());
        System.out.println(test.min());
    }
}


題28:字符串的排列

題目:輸入一個字符串,打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a、b、c所能排列出來的所有字符串abc、acb、bac、bca、cab和cba。

public class Main {
    public static void main(String[] args){
    permutation("abc");
    }

    public static void permutation(String str){
   int count=0;
   if(str==null){
       return;
   }
   char []  chs=str.toCharArray();//將字符串轉換為字符數組
   int point=0;
   System.out.print(chs);
   System.out.print(" ");
   count++;
   char temp1=chs[point];
   chs[point]=chs[++point];
   chs[point]=temp1;
   while (!String.valueOf(chs).equals(str)){
       System.out.print(chs);
       System.out.print(" ");
       count++;
       if(point==chs.length-1){
           char temp=chs[point];
           chs[point]=chs[0];
           chs[0]=temp;
           point=0;
       }else {
           char temp=chs[point];
           chs[point]=chs[++point];
           chs[point]=temp;
       }
   }
    System.out.println(count);
    }
}


題29:數組中出現次數超過一半的數組

題目描述
數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入一個長度為9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。如果不存在則輸出null。

public class Main {
    public static void main(String[] args){
    int [] array={1,2,3,2,2,2,5,4,2};
    System.out.println(morethanhalfnumber(array));
    }

    public static Integer  morethanhalfnumber(int [] array){
        int count=1;
        int temp=array[0];
        for(int i=1;i<array.length;i++){
            if(temp==array[i]){
                count++;
            }else {
                count--;
                if(count==0){
                    temp=array[i];
                    count++;
                }
            }
        }
        int count1=0;
        for(int i=0;i<array.length;i++){
            if(array[i]==temp){
                count1++;
            }
        }
        return count1>=array.length/2 ? temp:null;
    }
}


題30:最小的k個數

題目描述
輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4。

import java.util.ArrayList;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args){
    int [] array={4,5,1,6,2,7,3,8};
    int k=4;
    System.out.println(MinKnumber(array,k));

    }

    public static ArrayList<Integer> MinKnumber(int [] array, int k){
    if(array==null)
        return null;
    ArrayList<Integer> list = new ArrayList<Integer>(k);

    if(k>array.length)
        return list;
        TreeSet<Integer> tree=new TreeSet<Integer>();
        for(int i=0;i<array.length;i++){
            tree.add(array[i]);
        }
        int i=0;
        for (Integer elem:tree){
            if(i>k-1)
                break;
            list.add(elem);
            i++;
        }
        return list;
    }
}

劍指Offer(21-30)