Dimple在左耳聽風ARTS打卡(二十三)

所謂ARTS: 每週至少做一個LeetCode的算法題;閱讀並點評至少一篇英文技術文章;學習至少一個技術技巧;分享一篇有觀點和思考的技術文章。(也就是Algorithm、Review、Tip、Share 簡稱ARTS)這是第二十三期打卡。

Algorithm LeetCode算法

兩個數組的交集
(https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/)

題目描述:給定了兩個數組,編寫一個函數來計算它們的交集。

示例1:

輸入:nums1 = [1,2,2,1], nums2 = [2,2]

輸出:[2,2]

示例2:

輸入:nums1 = [4,9,5],nums2 = [9,4,9,8,4]

輸出:[4,9]

說明:

  • 輸出結果中每個元素出現的次數,應與元素在兩個數組中出現的次數一致
  • 我們可以不考慮輸出結果的順序

用哈希表進行題解

還記得剛開始刷算法題的時候,也做過查找的題目,但是剛開始都是通過循環來暴力查找。直到我看到很多更優秀的題解,才發現還可以通過哈希來做性能優化。

所以,拿到這題的第一個感覺就是,是否能通過哈希來解決呢,事實證明是可以的。

  • 首先,我們用HashMap記錄第一個數組中的元素,把它存入key,出現的次數存入value,畢竟出現次數可能不止一次

  • 第二,去遍歷第二個數組,如果找到對應元素,添加這個元素到列表

  • 第三,在第二步,找到對應的元素,就把value減1,如果value等於1,需要刪除這個key,說明數組1中此元素已經遍歷結束,不會再有交集

具體代碼如下:

public static int[] intersect(int[] nums1,int[] nums2) {
	// 先把數組一的內容添加到map
	Map<Integer, Integer> map = new HashMap<>();
	for (int i = 0; i < nums1.length; i++) {
		if (map.containsKey(nums1[i])) {
			map.put(nums1[i], map.get(nums1[i]) + 1);
		} else {
			map.put(nums1[i], 1);
		}
	}
		
	// 遍歷數組二,找出相同的數據
	List<Integer> info = new ArrayList<>();
	for (int i = 0; i < nums2.length; i++) {
		if (map.containsKey(nums2[i])) {
			info.add(nums2[i]);
			if (map.get(nums2[i]) > 1) {
				map.put(nums2[i], map.get(nums2[i]) -1);
			} else {
				map.remove(nums2[i]);
			}
				
		}
	}
		
	// 利用stream,方便轉換
	int[] arr2 = info.stream().mapToInt(Integer::valueOf).toArray();	
	return arr2;
}

在這裏,小編把List轉換成int[]用了stream,關於stream的一些方式,可能有些讀者還不大熟悉,小編在後面Tip 一個技術技巧裏做了一部分記錄。

Review 閱讀並點評至少一篇英文文章

Android Architecture Components
(https://developer.android.com/topic/libraries/architecture)

前幾天和一位球友聊天,聊到了Android上的AAC框架,因爲自己沒有去用過這個框架,所以就去官網找資料。

以前學習Android的時候,就是去官網找的資料,現在還是這樣,Google本身對這些自己開源的東西很上心,而且還算是比較詳細了。

AAC框架,在這份文檔裏寫的還是蠻好的,還有不過需要仔細觀看,我也就是走馬觀花有個大概的瞭解罷了。如果你也感興趣,歡迎一起來交流噢。

Tip 一個技術技巧

說來也巧,最近在學習《Java性能調優實戰》的課程,剛好有關於Stream一節的講解,用Stream來處理遍歷,在一定情況下能提升性能,感興趣的同學,可以去看看該專欄的第6課。

什麼是Stream

在 Java8 之前,我們通常是通過 for 循環或者 Iterator 迭代來重新排序合併數據,又或者通過重新定義Collections.sorts的Comparator方法來實現,這兩種方式對於大數據量系統來說,效果並不是很理想。

Java 8中添加了一個新的接口類Stream,他和我們之前接觸的字節流概念不太一樣,Java 8集合中的Stream相當於高級別版的Iterator,他可以通過Lambda表達式對集合進行各種非常便利、高效的聚合操作(Aggregate Operation),或者大批量數據操作(Bulk Data Operation)。

我們在應用層就可以高效地實現類似數據庫SQL的聚合操作,而在數據操作方面,Stream不僅可以通過串行的方式實現數據操作,還可以通過並行的方式處理大批量數據,提高數據的處理效率。

Stream轉換

那麼回到我們算法題裏使用的獎List轉換成int[],就是通過stream的轉換得來的結果。

// List<Integer> 轉 int[]
int[] arr1 = list1.stream().mapToInt(Integer::valueOf).toArray();
// 想要轉換成int[]類型,就得先轉成IntStream。
// 這裏就通過mapToInt()把Stream<Integer>調用Integer::valueOf來轉成IntStream
// 而IntStream中默認toArray()轉成int[]。
 
// Integer[] 轉 int[]
int[] arr2 = Arrays.stream(integers1).mapToInt(Integer::valueOf).toArray();
// 思路同上。先將Integer[]轉成Stream<Integer>,再轉成IntStream。

關於Stream還有很多需要學習的地方,這一小部分還只是皮毛,在後續的學習中,小編再好好整理一番。

Share 一篇有觀點和思考的技術文章

設計模式走起來。

公衆號地址:
設計模式之模板方法模式(一)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章