2020年4月13日

今日算法題 4. 尋找兩個有序數組的中位數

給定兩個大小爲 m 和 n 的有序數組 nums1 和 nums2。

請你找出這兩個有序數組的中位數,並且要求算法的時間複雜度爲 O(log(m + n))。

你可以假設 nums1 和 nums2 不會同時爲空。

示例 1:

nums1 = [1, 3]
nums2 = [2]

則中位數是 2.0
示例 2:

nums1 = [1, 2]
nums2 = [3, 4]

則中位數是 (2 + 3)/2 = 2.5

//題解中給出的解釋暫時無法理解,後續研究
public static double findMedianSortedArrays(int[] nums1, int[] nums2) {
		int[]  arr = new int[nums1.length + nums2.length];
		int nums1Index = 0;
		int nums2Index = 0;
		for (int i = 0; i < arr.length ; i++) {
			if(nums1Index >= nums1.length){
				arr[i] = nums2[nums2Index];
				nums2Index++;
				continue;
			}else if(nums2Index >= nums2.length){
				arr[i] = nums1[nums1Index];
				nums1Index++;
				continue;
			}
			if(nums1[nums1Index] > nums2[nums2Index]){
				arr[i] = nums2[nums2Index];
				nums2Index++;
			}else{
				arr[i] = nums1[nums1Index];
				nums1Index++;
			}
		}
		if(arr.length%2==0){
			int i = arr[arr.length / 2-1] + arr[arr.length / 2 ];
			double v = Double.valueOf(i) / 2;
			return v;
		}else{
			return arr[arr.length / 2];
		}
	}

java面試題

  1. 接口和抽象類有什麼區別?
    抽象類使用extends來繼承 ,接口必須使用implements 來實現接口
    構造函數:抽象類可以有構造函數;接口不能有。
    main 方法:抽象類可以有 main 方法,並且我們能運行它;接口不能有 main 方法。
    訪問修飾符:接口中的方法默認使用 public 修飾;抽象類中的方法可以是任意訪問修飾符。
  2. java 中 IO 流分爲幾種?
    按功能來分:輸入流(input)、輸出流(output)。
    按類型來分:字節流和字符流。
    字節流和字符流的區別是:字節流按 8 位傳輸以字節爲單位輸入輸出數據,字符流按 16 位傳輸以字符爲單位輸入輸出數據。
  3. BIO、NIO、AIO 有什麼區別?
    BIO:Block IO 同步阻塞式 IO,就是我們平常使用的傳統 IO,它的特點是模式簡單使用方便,併發處理能力低。
    NIO:New IO 同步非阻塞 IO,是傳統 IO 的升級,客戶端和服務器端通過 Channel(通道)通訊,實現了多路複用。
    AIO:Asynchronous IO 是 NIO 的升級,也叫 NIO2,實現了異步非堵塞 IO ,異步 IO 的操作基於事件和回調機制。
  4. Files的常用方法都有哪些?
    Files.exists():檢測文件路徑是否存在。
    Files.createFile():創建文件。
    Files.createDirectory():創建文件夾。
    Files.delete():刪除一個文件或目錄。
    Files.copy():複製文件。
    Files.move():移動文件
    Files.size():查看文件個數。
    Files.read():讀取文件。
    Files.write():寫入文件。
  5. java 容器都有哪些?
    collection->list (vector->stack,arraylist,linkedlist)
    ->queue (linkedlist,priorityqueue)
    ->set (hashset->linkhashset,treeset)
    map->hashmap
    ->treemap
  6. Collection 和 Collections 有什麼區別?
    ava.util.Collection 是一個集合接口(集合類的一個頂級接口)。它提供了對集合對象進行基本操作的通用接口方法。Collection接口在Java 類庫中有很多具體的實現。Collection接口的意義是爲各種具體的集合提供了最大化的統一操作方式,其直接繼承接口有List與Set。
    Collections則是集合類的一個工具類/幫助類,其中提供了一系列靜態方法,用於對集合中元素進行排序、搜索以及線程安全等各種操作。
  7. List、Set、Map 之間的區別是什麼?
  8. HashMap 和 Hashtable 有什麼區別?
    hashMap去掉了HashTable的contains方法,但是加上了containsValue()和containsKey()方法。
    hashTable同步的,而HashMap是非同步的,效率上逼hashTable要高。
    hashMap允許空鍵值,而hashTable不允許。
  9. 如何決定使用 HashMap 還是 TreeMap?
    對於在Map中插入、刪除和定位元素這類操作,HashMap是最好的選擇。然而,假如你需要對一個有序的key集合進行遍歷,TreeMap是更好的選擇。基於你的collection的大小,也許向HashMap中添加元素會更快,將map換爲TreeMap進行有序key的遍歷。
  10. 說一下 HashMap 的實現原理?
    HashMap概述: HashMap是基於哈希表的Map接口的非同步實現。此實現提供所有可選的映射操作,並允許使用null值和null鍵。此類不保證映射的順序,特別是它不保證該順序恆久不變。
    HashMap的數據結構: 在java編程語言中,最基本的結構就是兩種,一個是數組,另外一個是模擬指針(引用),所有的數據結構都可以用這兩個基本結構來構造的,HashMap也不例外。HashMap實際上是一個“鏈表散列”的數據結構,即數組和鏈表的結合體。
    當我們往Hashmap中put元素時,首先根據key的hashcode重新計算hash值,根據hash值得到這個元素在數組中的位置(下標),如果該數組在該位置上已經存放了其他元素,那麼在這個位置上的元素將以鏈表的形式存放,新加入的放在鏈頭,最先加入的放入鏈尾.如果數組中該位置沒有元素,就直接將該元素放到數組的該位置上。
    需要注意Jdk 1.8中對HashMap的實現做了優化,當鏈表中的節點數據超過八個之後,該鏈表會轉爲紅黑樹來提高查詢效率,從原來的O(n)到O(logn)
  11. 說一下 HashSet 的實現原理?
    HashSet底層由HashMap實現
    HashSet的值存放於HashMap的key上
    HashMap的value統一爲PRESENT
  12. ArrayList 和 LinkedList 的區別是什麼?
    最明顯的區別是 ArrrayList底層的數據結構是數組,支持隨機訪問,而 LinkedList 的底層數據結構是雙向循環鏈表,不支持隨機訪問。使用下標訪問一個元素,ArrayList 的時間複雜度是 O(1),而 LinkedList 是 O(n)。
  13. 如何實現數組和 List 之間的轉換?
    List轉換成爲數組:調用ArrayList的toArray方法。
    數組轉換成爲List:調用Arrays的asList方法。
  14. ArrayList 和 Vector 的區別是什麼?
    Vector是同步的,而ArrayList不是。然而,如果你尋求在迭代的時候對列表進行改變,你應該使用CopyOnWriteArrayList。
    ArrayList比Vector快,它因爲有同步,不會過載。
    ArrayList更加通用,因爲我們可以使用Collections工具類輕易地獲取同步列表和只讀列表。
  15. Array 和 ArrayList 有何區別?
    Array可以容納基本類型和對象,而ArrayList只能容納對象。
    Array是指定大小的,而ArrayList大小是固定的。
    Array沒有提供ArrayList那麼多功能,比如addAll、removeAll和iterator等。
  16. 在 Queue 中 poll()和 remove()有什麼區別?
    poll() 和 remove() 都是從隊列中取出一個元素,但是 poll() 在獲取元素失敗的時候會返回空,但是 remove() 失敗的時候會拋出異常。
  17. 哪些集合類是線程安全的?
    vector:就比arraylist多了個同步化機制(線程安全),因爲效率較低,現在已經不太建議使用。在web應用中,特別是前臺頁面,往往效率(頁面響應速度)是優先考慮的。
    statck:堆棧類,先進後出。
    hashtable:就比hashmap多了個線程安全。
    enumeration:枚舉,相當於迭代器。
  18. 迭代器 Iterator 是什麼?
    迭代器是一種設計模式,它是一個對象,它可以遍歷並選擇序列中的對象,而開發人員不需要了解該序列的底層結構。迭代器通常被稱爲“輕量級”對象,因爲創建它的代價小。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章