Leetcode - Rotate Array

**
Question:
Rotate an array of n elements to the right by k steps.

For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].

Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
**

My code:

public class Solution {
    public void rotate(int[] nums, int k) {
        k = k % nums.length;
        int sentinel = nums.length - k;
        int[] temp = new int[nums.length];
        for (int i = 0; i < nums.length; i++)
            if (i < sentinel)
                temp[i + k] = nums[i];
            else
                temp[i + k - nums.length] = nums[i];
        for (int i = 0; i < nums.length; i++)
            nums[i] = temp[i];
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[] nums = {1,2};
        for (int i = 0; i < nums.length; i++)
            System.out.print(nums[i] + " ");
        System.out.println();
        test.rotate(nums, 1);
        for (int i = 0; i < nums.length; i++)
            System.out.print(nums[i] + " ");
    }
}

My test result:

Paste_Image.png

這次的還是比較簡單瘫怜。。本刽。說下思路吧鲸湃。
首先這個k得理解好赠涮。是用來移動的步數(shù)。如果移動的范圍超出了右邊的limit暗挑,那么就接著從左邊開始移動笋除。很類似于圖像處理時(shí)算的neighbour。也需要進(jìn)行這樣的映射炸裆。
那么一定存在這么一個點(diǎn)垃它,他的左邊全部是可以正常移動相應(yīng)的k,而這個點(diǎn)已經(jīng)這個點(diǎn)的右邊晒衩,移動k步后都會轉(zhuǎn)到左邊嗤瞎。
所以必須找到這個點(diǎn),我設(shè)為听系,sentinel.
找到了之后贝奇,就進(jìn)行判斷被,小于他的正常移動靠胜。大于等于他的掉瞳,正常移動后再減去一個數(shù)組長度就到左邊去了。
但是這次作業(yè)有兩個問題需要注意浪漠。
1.k是可以任意大的陕习,也就是說可以大于數(shù)組長度。因?yàn)榭梢匀我庖苿硬綌?shù)址愿。所以该镣,必須首先對k進(jìn)行處理。 k = k % nums.length;
2.我們要明白這個方法是干什么的响谓。我們傳進(jìn)來一個數(shù)組的引用损合,然后處理,再返回娘纷。
一開始嫁审,處理完后,我直接

nums = temp;

以為這樣就可以直接指向這個處理好的數(shù)組了赖晶。的確也是如此律适。
**
但是,這是錯的遏插。
仔細(xì)回想下C語言里面學(xué)的函數(shù)調(diào)用時(shí)棧的結(jié)構(gòu)捂贿。Java類似。
我們在main函數(shù)中傳入nums時(shí)胳嘲,會拷貝一份指向nums的引用眷蜓,存放在方法rotate的活動空間上。所以胎围,如果傳入的直接就是數(shù)(int,double,float...)吁系,我們在活動區(qū)間修改這些傳入?yún)?shù)是不會影響到原數(shù)據(jù)的德召。這就是所謂的改變形參不會改變實(shí)參。
但是這里不同汽纤,傳入的是地址上岗,或者說,指向數(shù)組的一個指針蕴坪。
所以我們可以通過修改這個指針指向的內(nèi)容肴掷,而達(dá)到修改實(shí)參的效果。
但是背传,我又犯了一個錯誤呆瞻。我以為nums = temp;就可以修改實(shí)參了径玖。
其實(shí)是大錯特錯的痴脾。
因?yàn)樵谀菈K內(nèi)存位置處,我拷貝的是指向?qū)崊ums的地址∈嵝牵現(xiàn)在我把該地址抹掉赞赖,存入指向temp的地址。那么冤灾,原nums的數(shù)據(jù)發(fā)生改變了嗎前域?
沒有。因?yàn)槲覀冊诜椒╮otate中進(jìn)行的操作沒有返回到實(shí)參中韵吨。
所以匿垄,必須得將temp數(shù)組再重新拷貝給nums
**

這道題,我多設(shè)了一個數(shù)組來進(jìn)行處理归粉。這是上普林斯頓算法課時(shí)椿疗,老師在講 merge sort時(shí)給我的靈感。所以說盏浇,那些課的東西還是有用的。

**
總結(jié)下:
1.k要注意可以隨意大小
2.在方法中芽狗,如何修改實(shí)參的內(nèi)容
之前學(xué)習(xí)的C語言绢掰,對于了解Java還是很有用的。正如我現(xiàn)在學(xué)習(xí)Java童擎,了解OOP滴劲,然后學(xué)校的C++考試我其實(shí)就沒有那么虛了。
**

發(fā)現(xiàn)LJ有種讓人欲罷不能的感覺顾复。也許也是因?yàn)閷?shí)在不想學(xué)習(xí)電氣的緣故吧班挖。。芯砸。
Anyway,
Good luck, Richardo!

重做了下萧芙,看了答案知道了如何使用
time O(n), Space: O(n) 的做法给梅。

public class Solution {
    /* Solution 1: time: O(n) space: O(n)
    public void rotate(int[] nums, int k) {
        if (nums == null || nums.length == 0)
            return;
        int n = nums.length;
        int[] ret = new int[n];
        k = k % n;
        for (int i = k; i < n; i++)
            ret[i] = nums[i - k];
        for (int i = 0; i < k; i++)
            ret[i] = nums[i + n - k];
        for (int i = 0; i < n; i++)
            nums[i] = ret[i];
    }
    */
    
    /** Solution 2: time O(n), Space: O(1)  */
    public void rotate(int[] nums, int k) {
        if (nums == null || nums.length == 0)
            return;
        int n = nums.length;
        k = k % n;
        reverse(0, n - k, nums);
        reverse(n - k, k, nums);
        reverse(0, n, nums);
    }
    
    private void reverse(int begin, int length, int[] nums) {
        for (int i = begin; i < begin + length / 2; i++) {
            int temp = nums[i];
            int swapIndex = begin + length - 1 - (i - begin);
            nums[i] = nums[swapIndex];
            nums[swapIndex] = temp;
        }
    }
    
    
    public static void main(String[] args) {
        Solution test = new Solution();
        int[] nums = {1, 2, 3, 4, 5, 6, 7};
        for (int i = 0; i < nums.length; i++)
            System.out.print(nums[i] + ", ");
        System.out.println();
        test.rotate(nums, 4);
        for (int i = 0; i < nums.length; i++)
            System.out.print(nums[i] + ", ");
        System.out.println();
    }
}

參考的網(wǎng)站:
http://www.programcreek.com/2015/03/rotate-array-in-java/

其中有一段對于
System.arraycopy() vs. Arrays.copyOf() in Java
的分析,還不錯.
http://www.programcreek.com/2015/03/system-arraycopy-vs-arrays-copyof-in-java/

這個方法也不是很巧双揪。我想得時(shí)候想復(fù)雜了动羽。
沒什么難度。

Anyway, Good luck, Richardo!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渔期,一起剝皮案震驚了整個濱河市运吓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疯趟,老刑警劉巖拘哨,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異信峻,居然都是意外死亡倦青,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門站欺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來姨夹,“玉大人,你說我怎么就攤上這事矾策×渍耍” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵贾虽,是天一觀的道長逃糟。 經(jīng)常有香客問我,道長蓬豁,這世上最難降的妖魔是什么绰咽? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮地粪,結(jié)果婚禮上取募,老公的妹妹穿的比我還像新娘。我一直安慰自己蟆技,他們只是感情好玩敏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著质礼,像睡著了一般旺聚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上眶蕉,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天砰粹,我揣著相機(jī)與錄音,去河邊找鬼造挽。 笑死碱璃,一個胖子當(dāng)著我的面吹牛弄痹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播厘贼,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼界酒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了嘴秸?” 一聲冷哼從身側(cè)響起毁欣,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岳掐,沒想到半個月后凭疮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了款青。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡衰腌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出觅赊,到底是詐尸還是另有隱情右蕊,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布吮螺,位于F島的核電站饶囚,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸠补。R本人自食惡果不足惜萝风,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望规惰。 院中可真熱鬧,春花似錦泉蝌、人聲如沸歇万。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粥鞋。三九已至瞄崇,卻和暖如春壕曼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背等浊。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留筹燕,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓撒踪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親制妄。 傳聞我的和親對象是個殘疾皇子掸绞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)耕捞。 張土汪:刷leetcod...
    土汪閱讀 12,724評論 0 33
  • Rotate Array(189 俺抽,61) Rotate an array of n elements to th...
    raincoffee閱讀 129評論 0 0
  • 1. Two Sum 用hash可以得到O(n)時(shí)間的解法敞映,用python中的enumerate函數(shù),可以獲得元素...
    Morphiaaa閱讀 426評論 0 0
  • 一凌埂、框架 1驱显、Mac系統(tǒng)及常用工具、進(jìn)制;C數(shù)據(jù)類型瞳抓、常量變量埃疫、運(yùn)算符、表達(dá)式孩哑、格式化輸入輸出 2栓霜、關(guān)系運(yùn)算符、邏...
    師景福閱讀 679評論 0 1
  • 知識分子在意一篇文章里的思考角度和方法横蜒,偽知識分子在意一篇文章里可以被其說出去的金句胳蛮。——by梁歡 當(dāng)被問...
    不吃面也不開心閱讀 202評論 0 0