剑指算法
劍指算法
題目二:單例設計模式
1.題目描述:設計一個類,只能生成一個實例化對象。
? (1)分析:例如:windows中任務管理器,jvm回收器,運行過程中只有一個實例,創建對象會使用該類的構造方法,那么可以將其設置為private,由該類提供一個對象,由該類的靜態方法提供出來,保證對象一直是該類提供的。
? (2)提供2個,餓漢式和懶漢式(線程不安全,需要改為線程安全)
一:懶漢式: 優點是線程安全,但是對象一直存在于內存中,浪費空間。
public class Singleton{private Singleton singletonInstance=new SingletonInstance();priate Singleton(){}public static Singleton getInstance(){return singletonInstance;}}}二:餓漢式:優點是對象在需要的時候才創建,不浪費資源,缺點是多線程中不安全,需要改進。
線程不安全:
public class Singleton{ //此處不實例化對象。private Singleton singletonInstance;priate Singleton(){}public static Singleton getInstance(){if(SingletonInstance==null){//此處在多線程進行時,如果線程1進入這里阻塞,那么線程二進行上面的判斷的時候,發現對象是沒有創建的,則還會進入這個分支語句。則會//創建2個對象。不能保證單例的特點了。singleton=new Singleton();}return singletonInstane;}}}線程安全
public class Singleton{ private static Singleton singletonInstance;private Singleton() {}public static Singleton getSingletongHolder() {//第一層訪問控制,能節約線程的等待時間。如果對象已經創立了則無需等待。if (singletonInstance == null) {//同步代碼 synchronized (Singleton.class) {//第二層控制,保證對象不存在時才創建。if (singletonInstance == null) {singletonInstance = new Singleton();}}}return singletonInstance;} }題目三:二維數組中查找目標值
1.題目描述:一個二維數組,每一行大小順序按從左到右排列;每一列按從上到下排列。給定一個target,確定是否在其中。
? 數組例子:
| 5 | 8 | 9 | 10 |
| 6 | 11 | 12 | 13 |
| 7 | 14 | 15 | 16 |
2:思路一:(1)利用雙指針迫近尋找, 找到一個邊角,如右上角,如果target比他大,則行數+1,(因為右上角的值是該行最大的值)如果target比他小,則列數-1(該數值是該列中最小的數據,比他小只能是前幾列中),終止條件:row>array.length-1 || col<0;
//方法一:利用雙指針:利用該數組的排列順序,使得指針慢慢迫近。時間復雜度:O(mn)條件:public static boolean searchKey(int[][] array,int target){int row=0;int col=array[0].length-1;if(array==null||array.length==0){return false;}// 循環條件 row<array.length-1 && col>0;while (row<array.length-1 && col>0){//等于目標值,則輸出行和列,返回true 結束方法。if(array[row][col]==target){System.out.println(row+" "+col);return true;}//不等于目標值時的2種處理if(target<array[row][col]){col--;}else{row++;}}System.out.println("沒有找到");return false;}測試:
@Test public void mt(){int[][] array={{1,2,3,4},{3,5,6,7},{8,9,13,14},{15,16,17,18}};ArraySearch.searchKey(array,13);}結果:
2 2
總結
- 上一篇: im4java 文档_im4java学习
- 下一篇: ElasticSearch基本查询一(英