Algorithm
本周的 LeetCode 題目為 189. 旋轉陣列
題目簡介
給定一個陣列,向右旋轉 k 步,k 為非負數,示例如下:
輸入陣列 [1,2,3,4,5,6,7], k = 3
輸出陣列: [5,6,7,1,2,3,4]
解釋:
旋轉 1 步后得到: [7,1,2,3,4,5,6]
旋轉 2 步后得到: [6,7,1,2,3,4,5]
旋轉 3 步后得到: [5,6,7,1,2,3,4]
解法一:自己的想法
創建一個新陣列用來存盤結果,因為自己發現在旋轉移動后 現nums[i] = 原nums[i + nums.length - k % nums.length],取模是因為當 k 大于 nums.length 時,移動 nums.length 和不移動沒區別,通過的代碼如下:
class Solution {
public void rotate(int[] nums, int k) {
if (nums.length <= 1) {
return ;
}
int start = nums.length - k % nums.length;
if (start == nums.length) {
return ;
}
int[] temp = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
temp[i] = nums[i];
}
for (int i = 0; i < nums.length; i++) {
nums[i] = temp[start];
start = (start + 1) % nums.length;
}
}
}
但自己的代碼并不簡潔,存在一些改進的地方,
- 前面兩處的判斷有點兒冗余,可以去掉;
- 陣列拷貝是回圈賦值,經過了解后可以呼叫系統帶有的函式;
- 自己習慣從 0 開始找規律,變化后的
nums[0]等于什么,但表達起來復雜一些,
解法二:官方的解法一
和上面的代碼思路一樣,不同之處在于:
- 找規律時,反過來思考原來的
nums[0]現在會是什么; - 使用
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)來拷貝陣列,
class Solution {
public void rotate(int[] nums, int k) {
int[] ans = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
ans[(i+k) % nums.length] = nums[i];
}
System.arraycopy(ans, 0, nums, 0, nums.length);
}
}
解法三:官方的解法三
通過陣列翻轉來進行,先翻轉整個陣列,然后再分別翻轉 [0, k%nums.length - 1] 和 [k, nums.length] 兩部分即可,用題目給的示例,如下:
| 操作 | 結果 |
|---|---|
| 原來的陣列 | [1,2,3,4,5,6,7] |
| 全部翻轉 | [7,6,5,4,3,2,1] |
| 翻轉 [0, 3] | [5,6,7,4,3,2,1] |
| 翻轉 [4, 7] | [5,6,7,1,2,3,4] |
class Solution {
private void reverse(int[] nums, int start, int end) {
int temp = 0;
while (start < end) {
temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
public void rotate(int[] nums, int k) {
reverse(nums, 0, nums.length-1);
reverse(nums, 0, k % nums.length -1);
reverse(nums, k % nums.length, nums.length-1);
}
}
Review
本周 Review 的英文文章為:Happy birthday, Linux: From a bedroom project to billions of devices in 30 years
文章是慶祝 Linux 出現 30 周年, Greg Kroah-Hartman 接受 The Register 的采訪記錄(下面用 GK-H 代表 Greg Kroah-Hartman),下面快速回顧這篇采訪的內容,
先簡單介紹了 Linux 內核,之后被問到 Linux 內核開發程序中遇到的最大挑戰,GK-H 認為是開發模式,因為其擁有者眾多的開發者和用戶,目前 Linux 內核是采用基于時間的發布模式,
接下來問了有關 Linux 內核對 Rust 的整合,GK-H 介紹了可以通過 這篇摘要 來了解最新情況,目前 Linux 內核開發對 Rust 的態度是,“如果可能的話,使用 Rust 寫新的代碼,而不是替換現有的 C 代碼”,
接著 GK-H 被問到是否會出現 Linux 內核的競爭品,像瀏覽器那樣,GK-H 表示他希望在作業系統內核方面有一些真正的競爭,在 BSD 的開發者們沒有去蘋果前,他們之間存在不少合作,現在和 Google 的 Fuchsia 的開發者也有不少交流,
此外,GK-H 表示并不會去計劃未來,而是走一步看一步根據新的架構作出相應調整,他也不會去參與討論 Linux 為什么會成功、是否會受到地緣政治/民族主義等話題,而是專心放在代碼和專案上,最后,GK-H 介紹了 Linux 內核給他帶來了作業,環游世界,認識更多的朋友等等好處,
Tip
Java 中的每個基本型別都有其對應的包裝類,如 int 和 Integer,在創建 Integer 時,存在兩種方法:
Integer n = new Integer(100);
2:Integer n = Integer.valueOf(100);
方法2 優于 方法1,因為方法1總是會創建新的 Integer 實體,而方法2會其內部優化留給 Integer 的實作者來做,
我們一般稱 Integer.valueOf() 為靜態工廠方法,它盡可能地回傳快取的實體以節省記憶體,在 Java 8 中,如果值的范圍在 -128~127 之間,將會使用快取進而減少時間(相關鏈接),
Share
重新開始,ARTS 斷更了一年半多,現在又重新拾起來了,在更新前把之前的文章都刪掉了,忘掉過去,重新開始,最近三個月每個月初在朋友圈總結自己上個月的運動、閱讀與輸出的,以達到監督自己的目的,當自我曝光后,自己就會驅使自己,會約束自己來達到/接近一定目標,這就好比在沒人關注時,一個人可能更無法約束自己,更容易暴露自己一些不好的方面,因為反正也沒人注意到,
接下來的計劃是,每周保證更新一篇 ARTS 的同時,再更新一篇其他文章,可能是技術相關,可能是閱讀相關等等,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296113.html
標籤:其他
上一篇:【硬核攝影】給火車拍個全身照
