Dimple在左耳聽風ARTS打卡(第八期)

  • 2019 年 12 月 25 日
  • 筆記

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

Algorithm LeetCode算法

刪除排序數組中的重複項 (https://leetcode.com/problems/remove-duplicates-from-sorted-array/)

題目描述:給定一個排序數組,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後數組的新長度。

不要使用額外的數組空間,你必須在原地修改輸入數組並在使用 O(1) 額外空間的條件下完成。

示例 1:

給定數組 nums = [1,1,2],    函數應該返回新的長度 2, 並且原數組 nums 的前兩個元素被修改為 1, 2。    你不需要考慮數組中超出新長度後面的元素。  

示例 2:

給定 nums = [0,0,1,1,1,2,2,3,3,4],    函數應該返回新的長度 5, 並且原數組 nums 的前五個元素被修改為 0, 1, 2, 3, 4。  

說明:

為什麼返回數值是整數,但輸出的答案是數組呢?

請注意,輸入數組是以「引用」方式傳遞的,這意味着在函數里修改輸入數組對於調用者是可見的。

你可以想像內部操作如下:

// nums 是以「引用」方式傳遞的。也就是說,不對實參做任何拷貝  int len = removeDuplicates(nums);    // 在函數里修改輸入數組對於調用者是可見的。  // 根據你的函數返回的長度, 它會打印出數組中該長度範圍內的所有元素。  for (int i = 0; i < len; i++) {      print(nums[i]);  }  

拿到算法題,真的得好好考慮考慮邊界問題,以及一定要仔細審題,仔細審題,仔細審題,重要的事情說三遍。小編一開始很興奮,看到這題的時候,三下五除二就想到了用Map來做,畢竟key是可以衝掉相同的,最後得出的結果就是數量啦。請看我第一次的代碼:

public int removeDuplicates(int[] nums) {      Map<Integer, Integer> map = new HashMap<>();      for (int i : nums) {          map.put(i, i);      }      return map.size();  }  

看到這你們笑哭有沒有,我這樣做只是做出了數量,但是沒有改變nums數組的結構,所以很遺憾,肯定是各種GG咯,大大的「Wrong Answer」送給我。差點爆粗口。

沒辦法,還是繼續深挖題目,才看到題目的最後一段溫馨提示,不能改變數組結構,必須在原地修改。此時看到這題,其實就是把重複的數字用後面不重複的替換掉,後面的數據不用管了,因為系統會自動檢測你提供的重複數字的長度來獲取答案。

思路很清晰了有木有,你都沒必要考慮後面的情形,只需要通過你的算法把重複的數字填充即可。哇咔咔,恍然大悟。接下來就是考驗算法功力的時候了,小編這裡經過很多種實驗,最後把最優解拿出來和大家共享。

解題之後,我看了下別人的思路,才有了這個最優解,不然又是各種循環,各種遍歷了。或許,這就是算法題的魅力所在吧,題目誰都能解,就看你用什麼辦法,來達到最優路徑。就如同我們寫程序一樣,功能誰都可以寫,就看你怎麼寫出一個性能更好的功能來面對線上意想不到的壓力。

做算法題我也能得出各種心得,給自己送一顆小星星鼓勵下吧。如果你能悟出其他的道理,告訴小編,小編給你加雞腿。

public static int removeDuplicates(int[] nums) {      int i = 0;      for (int n : nums) {          int x = i - 1;          if (i < 1 || n != nums[x]) {              int j = i++;              nums[j] = n;          }        }      return i;  }  

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

Google I/O 2019 (https://www.androidauthority.com/google-io/)

上周即5.7–5.9號,Google開啟了一年一度的I/O大會,這又是開發者的一次盛會,國內很多新聞都第一時間報道,尤其是混跡我們IT圈子,消息更是靈通。

什麼是Google I/O大會呢?開篇就給我們介紹了,這是Google一年一度的開發者大會,谷歌會宣布其現有應用和服務的新硬件,軟件和各種更新。如何觀看呢?因為這個大會持續3天,有各種各樣的小活動,小講座等,所以官方會給出keynote的地址,以及視頻給我們進行觀看。怎麼獲取門票呢?參加過國內大會的都知道,這是通過官方隨機獲取的,小編去年報名了,就是沒中。他這個大會也是隨機的,不過中了的朋友,還是需要支付門票的哦。

小編之前知道這個大會,是因為學習Android,所以會經常關心這塊。這篇文章,也主要講了Android相關的新品。

眾所周知,現在Android設備和iOS設備,是智能手機的兩大霸主,所以這次大會,又更新了Android Q Beta 3版本,這也是一年一度的慣例了,都會把最新系統展示出來。還有以前的Google親兒子的手機都是代工的,最近開啟了自己的模式,重新命名為pixel系列。這次發佈了Google Pixel 3a和 Pixel 3a XL手機,感興趣的朋友,可以通過渠道獲取哦。小編同學以前用過親兒子,確實還不錯的。

以前多多少少聽過百度的自動駕駛,Google也在搞,而且技術還是很牛逼的樣子,這次大會也有介紹,Android Automotive OS。從這篇文章來看,只是大致寫了部分,其實還有很多其他的關於開發者相關的。比如Google已經支持Kotlin作為Android的第一語言,Google宣布Flutter將會支持Web,並且還會支持macOS、Windows and Linux,這是邁向跨平台的又一大步。

關於開發者大會的內容,請各位自行通過資源去搜索哦。小編在這就將這麼多啦。其實還有很多有趣的,吸引我的東西,我爭取再找找。

Tip 一個技術技巧

繼續分享《Java核心技術36講》做的學習筆記,關於Java安全的系列,接下去的幾期,都會針對這個來進行分享哦。

第31講 | 你了解Java應用開發中的注入攻擊嗎

典型回答 注入式(Inject)攻擊是一類非常常見的攻擊方式,其基本特徵是程序允許攻擊者將不可信的動態內容注入到程序中,並將其執行,這就可能完全改變最初預計的執行過程,產生惡意效果。

  • 首先,就是最常見的SQL注入攻擊
  • 第二,操作系統命令注入
  • 第三,XML注入攻擊

知識擴展 首先,一起來看看哪些Java API和工具構成了Java安全基礎。可以簡單歸為三個主要組成部分:

  1. 第一,運行時安全機制
  • 在類加載過程中,進行位元組碼驗證,以防止不合規的代碼影響JVM運行或者載入其他惡意代碼
  • 類加載器本身也可以對代碼之間進行隔離
  • 利用SecurityManager機制和相關的組件,限制代碼的運行時行為能力
  • 另外,從原則上來說,Java的GC等資源回收管理機制,都可以看作是運行時安全的一部分,如果相應機制失效,就會導致JVM出現OOM等錯誤,可看作是另類的拒絕服務
  1. 第二,Java提供的安全框架API,這是構建安全通信等應用的基礎,例如:
  • 加密、解密API
  • 授權、鑒權API
  • 安全通信相關的類庫
  1. 第三,就是JDK集成的各種安全工具,例如:
  • keytool,可以管理安全場景中不可或缺的密鑰、證書等,並且可以管理Java程序使用的keystore文件
  • jarsigner,用於對jar文件進行簽名或者驗證

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

繼續設計模式的學習執行,更新到裝飾者模式。我在這也想了下,以後可能還會不定期的分享一些我自己寫的學習心得,省的每次都是太乾的乾貨了。