劍指Offer(21-30)
阿新 • • 發佈:2018-02-02
不存在 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)