最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

移除元素Java實現(xiàn)方式

 更新時間:2024年04月10日 10:50:06   作者:嘩嘩的世界  
這篇文章主要介紹了移除元素Java實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

題意

給你一個數(shù)組 nums 和一個值 val,你需要 原地 移除所有數(shù)值等于 val 的元素,并返回移除后數(shù)組的新長度。

不要使用額外的數(shù)組空間,你必須僅使用 額外空間 并 原地 修改數(shù)組。

元素的順序可以改變。你不需要考慮數(shù)組中超出新長度后面的元素。

難度

簡單

說明

為什么返回數(shù)值是整數(shù),但輸出的答案是數(shù)組呢?

請注意,輸入數(shù)組是以「引用」方式傳遞的,這意味著在方法里修改輸入數(shù)組對于調(diào)用者是可見的。

你可以想象內(nèi)部操作如下:

// nums 是以“引用”方式傳遞的。也就是說,不對實參作任何拷貝
int len = removeElement(nums, val);
 
// 在方法里修改輸入數(shù)組對于調(diào)用者是可見的。
// 根據(jù)你的方法返回的長度, 它會打印出數(shù)組中 該長度范圍內(nèi) 的所有元素。
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

示例

  • 輸入:nums = [3,2,2,3], val = 3
  • 輸出:2, nums = [2,2]
  • 解釋:方法應該返回新的長度 2, 并且 nums 中的前兩個元素均為 2。例如,方法返回的新長度為 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也會被視作正確答案。
  • 輸入:nums = [0,1,2,2,3,0,4,2], val = 2
  • 輸出:5, nums = [0,1,3,0,4]
  • 解釋:方法應該返回新的長度 5, 并且 nums 中的前五個元素為 0, 1, 3, 0, 4。注意這五個元素可為任意順序。你不需要考慮數(shù)組中超出新長度后面的元素。

分析

看看本題的關(guān)鍵詞: 原地 、 、返回移除后數(shù)組的新長度。

如果忽略 原地 、 這兩個條件,我們可以很快寫出一個不錯的題解。

/**
 * @ClAssName RemoveElement
 * @Description TOOO
 * @Author woshi是神仙
 * @Date 2024/4/9 10:{MINUTE}
 */
public class RemoveElement {
 
    public static void main(String[] args) {
        //測試
        int[] nums =  new int[]{3 ,2 ,2 ,3 };
        int val = 3;
        System.out.println(removeElement(nums, val));
 
    }
 
    /**
     * 刪除數(shù)組中給定的元素,并返回新數(shù)組長度
     * @param nums
     * @param val
     * @return
     */
    public static int removeElement( int[] nums , int val){
        //初始化一個數(shù)組res,長度與nums相同,用于存儲移除目標元素后的結(jié)果
        int[] res = new int[nums.length];
        //初始化一個指針 j ,用于標記新數(shù)組索引位置,初始值為0
        int j = 0;
        //遍歷數(shù)組過濾目標數(shù)
        for (int i = 0; i < nums.length; i++) {
            //判斷當前元素是否等于目標值,過濾
            if (nums[i] != val){
                res[j++] = nums[i];
            }
        }
        //過濾完,返回新數(shù)組的長度,定義了 j 指針實現(xiàn)的
        return  j ;
    }
}

Java 并不存在引用傳遞,只有值傳遞,數(shù)組是一種特殊的對象,傳遞的是對象在堆中的地址,所以在方法中修改數(shù)組的內(nèi)容是會影響到調(diào)用者的。

從上面的例子可以看到,i一直都大于等于j,所以我們完全可以利用nums[0 ~ i - 1]來存儲res的內(nèi)容,所以題解就有了。

    public static int removeElement2( int[] nums , int val){
        //初始化兩個指針 i 和 j ,都是從數(shù)組的起始位置0開始的
         int i = 0 , j = 0;
 
         //遍歷數(shù)組,i 用于遍歷數(shù)組 , j 用于 指向下一個要更新的元素位置·
        for (; i < nums.length; i++) {
            //過濾掉目標值
            if (nums[i] != val){
                //將當前元素復制到 j 指向的位置
                nums[j++] = nums[i];
            }
        }
        //循環(huán)結(jié)束后,j就時新數(shù)組的長度,因為所有不等于val的元素都被復制到了數(shù)組的里面了
        return  j;
    }

通過這種方式,所有等于 val 的元素都被“跳過”了,沒有被復制到數(shù)組的前端。遍歷結(jié)束后,j 的位置就是新數(shù)組的長度,因為它指向了第一個“空閑”的位置,也就是第一個沒有被復制過的元素的位置。這樣,我們就實現(xiàn)了在原地修改數(shù)組的目標,并且返回了新數(shù)組的長度。

來看看題解效率:

只需要判斷是否等于目標值即可,所以這道題的時間復雜度是 ,空間復雜度是 ,非常簡單,一兩分鐘就能輕松解決!

對本道題時操作數(shù)組的,可以換另外一種寫法。

 public static int removeElement3( int[] nums , int val){
        //如果數(shù)組為空,直接返回
        if (nums.length ==0){
            return 0 ;
        }
        //定義一個慢指針
        int i = 0;
        // j 為快指針 ,用來遍歷數(shù)組
        for (int j = 0; j < nums.length; j++) {
            //如果當前元素不等于給定元素
            if (nums[j] != val){
                //將當前元素復制到慢指針的位置
                nums[i] = nums[j];
                
                //移動慢指針
                i++;
            }
        }
        //返回不重復元素的個數(shù)。
        return  i;
    }
  • i 是慢指針,j 是快指針。
  • 當 nums[j] ≠ val 時,將其(nums[j] 的值)復制到 nums[i]。然后遞增 i,再遞增 j。

這種寫法也是可以的,只是在判斷條件上有所不同,但是思路是一樣的。

效率同樣也非常高:

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于jvm-sandbox的imock開發(fā)指南詳解

    基于jvm-sandbox的imock開發(fā)指南詳解

    這篇文章主要為大家介紹了基于jvm-sandbox的imock開發(fā)指南詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java中Date與String相互轉(zhuǎn)換的方法

    Java中Date與String相互轉(zhuǎn)換的方法

    這篇文章主要為大家詳細介紹了Java中Date與String相互轉(zhuǎn)換方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java中的ArrayList底層源碼分析

    Java中的ArrayList底層源碼分析

    這篇文章主要介紹了Java中的ArrayList底層源碼分析,通過下標讀取元素的速度很快,這是因為ArrayList底層基于數(shù)組實現(xiàn),可以根據(jù)下標快速的找到內(nèi)存地址,接著讀取內(nèi)存地址中存放的數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • springboot集成測試最小化依賴實踐示例

    springboot集成測試最小化依賴實踐示例

    這篇文章主要為大家介紹了springboot集成測試最小化依賴實踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java8新特性Stream流詳解

    Java8新特性Stream流詳解

    Java8 Stream使用的是函數(shù)式編程模式,如同它的名字一樣,它可以被用來對集合進行鏈狀流式的操作,本文就將帶著你如何使用 Java 8 不同類型的 Stream 操作,同時還將了解流的處理順序,以及不同順序的流操作是如何影響運行時性能的
    2023-07-07
  • JavaMail入門教程之發(fā)送郵件(3)

    JavaMail入門教程之發(fā)送郵件(3)

    這篇文章主要為大家詳細介紹了JavaMail入門教程之發(fā)送郵件的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Java實現(xiàn)自定義Excel數(shù)據(jù)排序的方法詳解

    Java實現(xiàn)自定義Excel數(shù)據(jù)排序的方法詳解

    通常,我們可以在Excel中對指定列數(shù)據(jù)執(zhí)行升序或者降序排序,在需要自定義排序情況下,我們也可以自行根據(jù)排序需要編輯數(shù)據(jù)排列順序。本文將通過Java應用程序來實現(xiàn)如何自定義排序,需要的可以參考一下
    2022-09-09
  • Java 深入淺出掌握Map集合之雙列集合

    Java 深入淺出掌握Map集合之雙列集合

    雙列集合是每個元素都有鍵與值兩部分組成的集合,記錄的是鍵值對對應關(guān)系,即通過鍵可以找到值,鍵必須是唯一,值可以重復,接下來跟著小編具體了解吧
    2021-11-11
  • Java那點兒事之Map集合不為人知的秘密有哪些

    Java那點兒事之Map集合不為人知的秘密有哪些

    Map用于保存具有映射關(guān)系的數(shù)據(jù),Map集合里保存著兩組值,一組用于保存Map的key,另一組保存著Map的value,和查字典類似,通過key找到對應的value,通過頁數(shù)找到對應的信息。用學生類來說,key相當于學號,value對應name,age,sex等信息。用這種對應關(guān)系方便查找
    2021-10-10
  • Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例

    Springboot 接收POST、json、文本數(shù)據(jù)的方法 附示例

    這篇文章主要介紹了Springboot 接收POST、json、文本數(shù)據(jù)實踐,如果把 json 作為參數(shù)傳遞,我們可以使用 @requestbody 接收參數(shù),將數(shù)據(jù)直接轉(zhuǎn)換成對象,本文通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10

最新評論

崇义县| 黎城县| 府谷县| 霞浦县| 林芝县| 福建省| 隆安县| 车致| 五台县| 临湘市| 精河县| 当雄县| 米林县| 汝阳县| 电白县| 武鸣县| 疏勒县| 宜君县| 太保市| 繁峙县| 家居| 湘乡市| 神农架林区| 韩城市| 绥江县| 吉木乃县| 乾安县| 宁河县| 肃北| 南充市| 贵溪市| 潜江市| 太仓市| 巨鹿县| 富平县| 雷州市| 台北市| 玛多县| 巴东县| 富蕴县| 彝良县|