每日一例 | 數(shù)組的異或操作&數(shù)組的動態(tài)和

今天時間相比而言比較充裕,所以就做了兩個算法題,當然也是題目比較簡單,兩個題目都是關(guān)于數(shù)組的,接下來,我們一起來看下吧!
數(shù)組異或操作
題目描述
題目基本信息
題目來源:力扣(leetcode)
題目鏈接:https://leetcode-cn.com/problems/xor-operation-in-an-array/
題目難度:簡單
題目描述
給你兩個整數(shù),n 和 start 。
數(shù)組 nums 定義為:nums[i] = start + 2*i(下標從 0 開始)且 n == nums.length 。
請返回 nums 中所有元素按位異或(XOR)后得到的結(jié)果。
示例 1:
輸入:n = 5, start = 0
輸出:8
解釋:數(shù)組 nums 為 [0, 2, 4, 6, 8],其中 (0 ^ 2 ^ 4 ^ 6 ^ 8) = 8 。
"^" 為按位異或 XOR 運算符。
示例 2:
輸入:n = 4, start = 3
輸出:8
解釋:數(shù)組 nums 為 [3, 5, 7, 9],其中 (3 ^ 5 ^ 7 ^ 9) = 8.
示例 3:
輸入:n = 1, start = 7
輸出:7
示例 4:
輸入:n = 10, start = 5
輸出:2
提示:
1 <= n <= 10000 <= start <= 1000n == nums.length
提交記錄
這個題目已經(jīng)很簡單了,因為題目描述里面已經(jīng)包含答案了((nums[i] = start + 2*i),我們只需要用代碼把他實現(xiàn)就行了
第一次提交
不知道是不是題目太老了,所以提交之后只顯示內(nèi)存方面的提交信息,運行時間詳情不顯示
class Solution {
public int xorOperation(int n, int start) {
int result = 0;
for (int i = 0; i < n; i++) {
result ^= start + 2*i;
}
return result;
}
}

這個題目我覺得沒有可以優(yōu)化的點,但是在重復提交的過程中,我發(fā)現(xiàn)越提交,內(nèi)存排名越差,代碼還是同一個代碼:


感覺很魔幻,好了,我們繼續(xù)看第二個問題
數(shù)組的動態(tài)和
題目基本信息
題目來源:力扣(LeetCode)
題目鏈接:https://leetcode-cn.com/problems/running-sum-of-1d-array
題目難度:簡單
題目描述
給你一個數(shù)組 nums。數(shù)組「動態(tài)和」的計算公式為:runningSum[i] = sum(nums[0]…nums[i])。
請返回 nums的動態(tài)和。
示例 1:
輸入:nums = [1,2,3,4]
輸出:[1,3,6,10]
解釋:動態(tài)和計算過程為 [1, 1+2, 1+2+3, 1+2+3+4] 。
示例 2:
輸入:nums = [1,1,1,1,1]
輸出:[1,2,3,4,5]
解釋:動態(tài)和計算過程為 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。
示例 3:
輸入:nums = [3,1,2,10,1]
輸出:[3,4,6,16,17]
提示:
1 <= nums.length <= 1000-10^6 <= nums[i] <= 10^6
提交記錄
這個題目同樣也很簡單,解題思路題目也告訴你了,我們只需要循環(huán)遍歷就可以了
第一次提交
第一次的提交我定義了一個result,用于接收前面元素的和,定義了results數(shù)組用于存放返回結(jié)果:
class Solution {
public int[] runningSum(int[] nums) {
int result = 0;
int[] results = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
if (i == 0) {
result = 0;
} else {
result = results[i - 1];
}
results[i] = result + nums[i];
}
return results;
}
}
時間方面表現(xiàn)很優(yōu)秀,內(nèi)存也尚可:


第二次提交
第二次我去掉了中間變量,其他的基本沒變
class Solution {
public int[] runningSum(int[] nums) {
int[] results = new int[nums.length];
for (int i = 0; i < nums.length; i++) {
if (i == 0) {
results[i] = nums[i];
} else {
results[i] = results[i - 1] + nums[i];
}
}
return results;
}
}
但這一次,相比于第一次,內(nèi)存方面表現(xiàn)更優(yōu)秀了:


第三次提交
根據(jù)第二次的優(yōu)化經(jīng)驗,這次我想再去掉一個變量,去掉了results數(shù)組:
class Solution {
public int[] runningSum(int[] nums) {
for (int i = 0; i < nums.length; i++) {
if (i != 0) {
nums[i] = nums[i - 1] + nums[i];
}
}
return nums;
}
}
但是這時候,性能不勝反而降低了,運行時間上依然優(yōu)秀,但是內(nèi)存上變差了,從38.3MB變成了38.4MB:

但是我在重復多次提交的之后,它竟然性能又變好了:

這個就很魔幻,提交過程中還有變成38.5Mb的情況。當然,可能系統(tǒng)在檢測運行內(nèi)存的時候有一定的誤差,只要你的性能差異不是很大,多執(zhí)行幾次,數(shù)據(jù)應該就比較穩(wěn)定了。
總結(jié)
今天的兩個算法題目都是有關(guān)數(shù)組的,題目比較簡單,但第一次提交之后還是有一定的優(yōu)化空間,這也就從側(cè)面反映出一個問題,任何系統(tǒng)在第一次構(gòu)建的時候都不可能特別完美,所以在系統(tǒng)升級迭代的過程中,我們要盡可能優(yōu)化調(diào)整,讓系統(tǒng)能夠越來越優(yōu)秀,性能越來越好。
這個就像我們小時候?qū)懽魑囊粯?,第一次寫完,再回過頭看的時候,還是會發(fā)現(xiàn)有很多病句和錯別字,或者會想到更好的句子或者表達方式,然后經(jīng)過你的不斷修改潤色,最后你的作文會越來越好看,越來越優(yōu)秀。如果再繼續(xù)類比的話,你會發(fā)現(xiàn)開發(fā)本身就和寫作文一樣,你要寫出好作文,你就要多閱讀,多積累,多寫,這樣你的經(jīng)驗會越來越豐富,寫的東西會越來越好。程序開發(fā)也是一種創(chuàng)作,你需要積累,需要閱讀優(yōu)秀的代碼,需要不斷練習,然后你才能寫出更優(yōu)秀的代碼。
當然,有一點我也認同的,文字的意義在于表達,表達是目的,文字只是工具,不應該為了讓文章更漂亮,刻意堆疊華麗的辭藻,這樣就本末倒置了,用問號白居易的話說就是"文章合為時而著歌詩合為事而作",任何脫離了表達的文字都是沒有意義的。寫代碼也是如此,技術(shù)服務于業(yè)務,技術(shù)以業(yè)務為中心,不能僅為了用各種高大上的牛逼技術(shù)而忽略了業(yè)務本身,任何脫離了業(yè)務的代碼也是沒有意義的。
- END -