1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

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

        共 6052字,需瀏覽 13分鐘

         ·

        2021-05-19 07:16

        今天時(shí)間相比而言比較充裕,所以就做了兩個(gè)算法題,當(dāng)然也是題目比較簡(jiǎn)單,兩個(gè)題目都是關(guān)于數(shù)組的,接下來,我們一起來看下吧!

        數(shù)組異或操作

        題目描述

        題目基本信息

        題目來源:力扣(leetcode

        題目鏈接:https://leetcode-cn.com/problems/xor-operation-in-an-array/

        題目難度:簡(jiǎn)單

        題目描述

        給你兩個(gè)整數(shù),n 和 start 。

        數(shù)組 nums 定義為:nums[i] = start + 2*i(下標(biāo)從 0 開始)且 n == nums.length 。

        請(qǐng)返回 nums 中所有元素按位異或(XOR)后得到的結(jié)果。

        示例 1:
        輸入:n = 5, start = 0
        輸出:8
        解釋:數(shù)組 nums 為 [0, 2, 4, 6, 8],其中 (0 ^ 2 ^ 4 ^ 6 ^ 8) = 8 。
             "^" 為按位異或 XOR 運(yùn)算符。
        示例 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 <= 1000
        • 0 <= start <= 1000
        • n == nums.length

        提交記錄

        這個(gè)題目已經(jīng)很簡(jiǎn)單了,因?yàn)轭}目描述里面已經(jīng)包含答案了((nums[i] = start + 2*i),我們只需要用代碼把他實(shí)現(xiàn)就行了

        第一次提交

        不知道是不是題目太老了,所以提交之后只顯示內(nèi)存方面的提交信息,運(yùn)行時(shí)間詳情不顯示

        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;
            }
        }

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

        感覺很魔幻,好了,我們繼續(xù)看第二個(gè)問題

        數(shù)組的動(dòng)態(tài)和

        題目基本信息

        題目來源:力扣(LeetCode) 題目鏈接:https://leetcode-cn.com/problems/running-sum-of-1d-array

        題目難度:簡(jiǎn)單

        題目描述

        給你一個(gè)數(shù)組 nums。數(shù)組「動(dòng)態(tài)和」的計(jì)算公式為:runningSum[i] = sum(nums[0]…nums[i])。

        請(qǐng)返回 nums的動(dòng)態(tài)和。

        示例 1:
        輸入:nums = [1,2,3,4]
        輸出:[1,3,6,10]
        解釋:動(dòng)態(tài)和計(jì)算過程為 [1, 1+2, 1+2+3, 1+2+3+4] 。
        示例 2:
        輸入:nums = [1,1,1,1,1]
        輸出:[1,2,3,4,5]
        解釋:動(dòng)態(tài)和計(jì)算過程為 [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

        提交記錄

        這個(gè)題目同樣也很簡(jiǎn)單,解題思路題目也告訴你了,我們只需要循環(huán)遍歷就可以了

        第一次提交

        第一次的提交我定義了一個(gè)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;
            }
        }

        時(shí)間方面表現(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)驗(yàn),這次我想再去掉一個(gè)變量,去掉了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;
            }
        }

        但是這時(shí)候,性能不勝反而降低了,運(yùn)行時(shí)間上依然優(yōu)秀,但是內(nèi)存上變差了,從38.3MB變成了38.4MB

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

        這個(gè)就很魔幻,提交過程中還有變成38.5Mb的情況。當(dāng)然,可能系統(tǒng)在檢測(cè)運(yùn)行內(nèi)存的時(shí)候有一定的誤差,只要你的性能差異不是很大,多執(zhí)行幾次,數(shù)據(jù)應(yīng)該就比較穩(wěn)定了。

        總結(jié)

        今天的兩個(gè)算法題目都是有關(guān)數(shù)組的,題目比較簡(jiǎn)單,但第一次提交之后還是有一定的優(yōu)化空間,這也就從側(cè)面反映出一個(gè)問題,任何系統(tǒng)在第一次構(gòu)建的時(shí)候都不可能特別完美,所以在系統(tǒng)升級(jí)迭代的過程中,我們要盡可能優(yōu)化調(diào)整,讓系統(tǒng)能夠越來越優(yōu)秀,性能越來越好。

        這個(gè)就像我們小時(shí)候?qū)懽魑囊粯?,第一次寫完,再回過頭看的時(shí)候,還是會(huì)發(fā)現(xiàn)有很多病句和錯(cuò)別字,或者會(huì)想到更好的句子或者表達(dá)方式,然后經(jīng)過你的不斷修改潤(rùn)色,最后你的作文會(huì)越來越好看,越來越優(yōu)秀。如果再繼續(xù)類比的話,你會(huì)發(fā)現(xiàn)開發(fā)本身就和寫作文一樣,你要寫出好作文,你就要多閱讀,多積累,多寫,這樣你的經(jīng)驗(yàn)會(huì)越來越豐富,寫的東西會(huì)越來越好。程序開發(fā)也是一種創(chuàng)作,你需要積累,需要閱讀優(yōu)秀的代碼,需要不斷練習(xí),然后你才能寫出更優(yōu)秀的代碼。

        當(dāng)然,有一點(diǎn)我也認(rèn)同的,文字的意義在于表達(dá),表達(dá)是目的,文字只是工具,不應(yīng)該為了讓文章更漂亮,刻意堆疊華麗的辭藻,這樣就本末倒置了,用問號(hào)白居易的話說就是"文章合為時(shí)而著歌詩合為事而作",任何脫離了表達(dá)的文字都是沒有意義的。寫代碼也是如此,技術(shù)服務(wù)于業(yè)務(wù),技術(shù)以業(yè)務(wù)為中心,不能僅為了用各種高大上的牛逼技術(shù)而忽略了業(yè)務(wù)本身,任何脫離了業(yè)務(wù)的代碼也是沒有意義的。

        - END -


        瀏覽 42
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            黄色www视频 | 亚洲无码电影院 | 日韩三级中文 | 日批视频在线免费观看 | 国产suv精品一区88l | 草比克在线视频 | 黄色免费在线观看 | 大奶av在线 | 大香蕉伊人视频网 | 婷婷五月综合久久中文字幕 |