欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言經(jīng)典順序表真題演練講解

 更新時(shí)間:2022年04月11日 15:33:47   作者:三分苦  
程序中經(jīng)常需要將一組數(shù)據(jù)元素作為整體管理和使用,需要?jiǎng)?chuàng)建這種元素組,用變量記錄它們,傳進(jìn)傳出函數(shù)等。一組數(shù)據(jù)中包含的元素個(gè)數(shù)可能發(fā)生變化,順序表則是將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示

1、移除元素

鏈接直達(dá):

https://leetcode-cn.com/problems/remove-element/

題目:

思路:

法一:依次挪動(dòng)數(shù)據(jù)進(jìn)行覆蓋

從第一個(gè)數(shù)據(jù)開(kāi)始進(jìn)行依次遍歷,如同示例1,依次遍歷數(shù)組,找到移除的元素2就把后面的數(shù)據(jù)往前挪動(dòng)進(jìn)行覆蓋,如圖所示:

 此法有個(gè)缺陷,題目中明確指出使用空間復(fù)雜度O(1)的方法解決此問(wèn)題,而此法的空間復(fù)雜度剛好為O(1),可以解決,不過(guò)考慮周全些,時(shí)間復(fù)雜度在情況最壞時(shí)為O(N^2),出現(xiàn)全是val的情況,將會(huì)挪動(dòng)n-1+n-2+……出現(xiàn)了等差數(shù)列,時(shí)間復(fù)雜度為O(N^2),此法不是最優(yōu),換。

法二:雙指針1.0

依次遍歷原數(shù)組,看是不是val,把不是val的值,拷貝到新數(shù)組,此法的時(shí)間復(fù)雜度是O(N),空間復(fù)雜度也是O(N),可是題目明確指出空間復(fù)雜度要為O(1),所以此法不行,但是仔細(xì)想想,如果繼續(xù)用此法雙指針,但是不另開(kāi)數(shù)組,就在原數(shù)組上改動(dòng)可否呢?,由此引出雙指針2.0

法三:雙指針2.0

此法是在法二的基礎(chǔ)上進(jìn)行的升級(jí),法二需要開(kāi)辟額外數(shù)組,此法直接原數(shù)組改動(dòng)。首先定義兩個(gè)變量src和dst為0,都作為數(shù)組nums的下標(biāo),依次遍歷src看nums[src]是否為val,若不是,將其賦給下標(biāo)dst,再src++,dst++。若nums[src]=nums[dst],則只把src++,dst不動(dòng),最后再把長(zhǎng)度dst返回即可。

代碼如下:

int removeElement(int* nums, int numsSize, int val){
    int dst=0;
    int str=0;
    while(str<numsSize)
    {
        if(nums[str]==val)
        {
            str++;
        }
        else
        {
            nums[dst]=nums[str];
            dst++;
            str++;
        }
    }
    return dst;
}

2、刪除有序數(shù)組中的重復(fù)項(xiàng)

鏈接直達(dá):

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

題目:

思路:

雙指針(不額外開(kāi)數(shù)組)

此題和上題類似,同樣可以采用雙指針,并在原數(shù)組進(jìn)行改動(dòng),只需要定義兩個(gè)變量dst和src作為數(shù)組nums的下標(biāo),但此時(shí)做出小變動(dòng),把src從下標(biāo)1開(kāi)始,而dst從下標(biāo)0開(kāi)始。讓nums[src]每次和它前一個(gè)也就是nums[src-1]相比較,如果相等,則src++,若不等就把nums[src-1]賦給nums[dst],再dst++,src++。

注意:

執(zhí)行完上述操作后,還存在一個(gè)問(wèn)題,那就是沒(méi)把src的最后一個(gè)下標(biāo)的值放到nums[dst]里頭去,就如同本題的示例,當(dāng)src走到倒數(shù)第二個(gè)值3的時(shí)候,和前一個(gè)3相等,此時(shí)需要++src,現(xiàn)在nums[src]就是4,和前一個(gè)值不相等,把3賦給nums[dst],此時(shí)src再++到空了,沒(méi)有數(shù)據(jù)和4比較了,越界,所以4就漏掉了。在如同當(dāng)后面2個(gè)數(shù)字同為3的時(shí)候,因?yàn)橐恢毕嗟龋瑂rc同樣+到空,3同樣漏掉,所以無(wú)論哪種情況,都要把最后一個(gè)數(shù)字移到nums[dst]上

畫(huà)圖演示:

代碼如下:

int removeDuplicates(int* nums, int numsSize){
    int dst=0;
    int src=1;
    while(src<numsSize)
    {
        if(nums[src]==nums[src-1])
        {
            src++;
        }
        else
        {
            nums[dst]=nums[src-1];
            dst++;
            src++;
        }
    }
    nums[dst]=nums[numsSize-1];
    dst++;
    return dst;
}

3、合并兩個(gè)有序數(shù)組

鏈接直達(dá):

合并兩個(gè)有序數(shù)組

題目:

思路:

法一:memmove + sort排序(冒泡、qsort等)

此法確實(shí)可以,不過(guò)當(dāng)題目中明確指出要用時(shí)間復(fù)雜度O(N)的方法解決此問(wèn)題的話,那么此法就行不通了,因?yàn)槊芭莸臅r(shí)間復(fù)雜度為O(N^2),而qsort的時(shí)間復(fù)雜度為O(N*logN)。均不是O(N),所以得換。

法二:歸并1.0

依次比較,每次把小的放到歸并數(shù)組。此法需要開(kāi)辟第三方數(shù)組a。其次,需要定義 i ,j ,dst 三個(gè)變量分別用來(lái)表示數(shù)組nums1,nums2,a的第一個(gè)下標(biāo),如果nums1[ i ]<nums[ j ],則a[dst++]=nums1[ i++ ],反之a(chǎn)[dst++]=nums2[ i++ ],依次遍歷下去,當(dāng)其中一個(gè)走完了,就把剩下的全部放到a數(shù)組里頭去,此法的最大問(wèn)題就是需要額外開(kāi)辟一個(gè)數(shù)組,以空間換時(shí)間,導(dǎo)致空間復(fù)雜度為O(N),但是我們?cè)诨诖朔ǖ幕A(chǔ)上可以進(jìn)行升級(jí),如下:

法三:歸并2.0

此法是在法二的基礎(chǔ)上進(jìn)行升級(jí),直接在nums1原數(shù)組上進(jìn)行改動(dòng),思想和法二差不多。不過(guò)有個(gè)需要改變的地方,法二是正著遍歷數(shù)組,但是此法則需要倒著來(lái)遍歷數(shù)組。那么此時(shí)的 i 變量就是nums1數(shù)組第m-1個(gè)下標(biāo),j變量就是nums2數(shù)組第n-1個(gè)下標(biāo),dst變量就是nums1數(shù)組最后一個(gè)元素下標(biāo)(m+n-1)。實(shí)現(xiàn)原理同法二,不做過(guò)多贅述。注意:如果nums2數(shù)組的下標(biāo) j 先結(jié)束,那么nums1剩下的數(shù)組剛好排在前面,不需要?jiǎng)?,如果是nums1數(shù)組的下標(biāo) i 先結(jié)束,則需要把nums2數(shù)組剩余的值賦到nums1數(shù)組上去。

畫(huà)圖演示:

 代碼如下:

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    int i=m-1;
    int j=n-1;
    int dst=m+n-1;
    while(i>=0&&j>=0)
    {
        if(nums1[i]>nums2[j])
        {
            nums1[dst--]=nums1[i--];
        }
        else
        {
            nums1[dst--]=nums2[j--];
        }
    }
    while(j>=0)
    {
        nums1[dst--]=nums2[j--];
    }
}

到此這篇關(guān)于C語(yǔ)言經(jīng)典順序表真題演練講解的文章就介紹到這了,更多相關(guān)C語(yǔ)言 順序表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++基礎(chǔ)知識(shí)總結(jié)

    C++基礎(chǔ)知識(shí)總結(jié)

    本文給大家匯總介紹了C++的一些基礎(chǔ)知識(shí),不管是對(duì)新手還是老鳥(niǎo)都有些幫助,希望大家能夠喜歡
    2017-05-05
  • C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì))

    C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(211.添加和查找單詞-數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑

    Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑

    今天小編就為大家分享一篇關(guān)于Dijkstra算法最短路徑的C++實(shí)現(xiàn)與輸出路徑,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-02-02
  • C++實(shí)現(xiàn)LeetCode(74.搜索一個(gè)二維矩陣)

    C++實(shí)現(xiàn)LeetCode(74.搜索一個(gè)二維矩陣)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(74.搜索一個(gè)二維矩陣),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • Qt實(shí)現(xiàn)畫(huà)筆功能

    Qt實(shí)現(xiàn)畫(huà)筆功能

    這篇文章主要為大家詳細(xì)介紹了Qt實(shí)現(xiàn)畫(huà)筆功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 手把手教你實(shí)現(xiàn)漂亮的Qt?登錄界面

    手把手教你實(shí)現(xiàn)漂亮的Qt?登錄界面

    最近在使用Qt5,Qt?Creator做一個(gè)管理系統(tǒng)類的項(xiàng)目,需要用到登錄界面,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++中const、volatile、mutable使用方法小結(jié)

    C++中const、volatile、mutable使用方法小結(jié)

    這篇文章主要介紹了C++中const、volatile、mutable使用方法小結(jié),需要的朋友可以參考下
    2020-01-01
  • C語(yǔ)言循環(huán)鏈表實(shí)現(xiàn)貪吃蛇游戲

    C語(yǔ)言循環(huán)鏈表實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言循環(huán)鏈表實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C語(yǔ)言內(nèi)存分布與heap空間分別詳細(xì)講解

    C語(yǔ)言內(nèi)存分布與heap空間分別詳細(xì)講解

    一個(gè)程序本質(zhì)上都是由 BSS 段、data段、text段三個(gè)組成的。這種概念在當(dāng)前的計(jì)算機(jī)程序設(shè)計(jì)中是非常重要的一個(gè)基本概念,并且在嵌入式系統(tǒng)的設(shè)計(jì)中也非常重要,牽涉到嵌入式系統(tǒng)執(zhí)行時(shí)的內(nèi)存大小分配,存儲(chǔ)單元占用空間大小的問(wèn)題
    2022-11-11
  • VS2019開(kāi)發(fā)Linux C++程序的實(shí)現(xiàn)步驟

    VS2019開(kāi)發(fā)Linux C++程序的實(shí)現(xiàn)步驟

    由于很多unix特有的函數(shù)無(wú)法在Windows上使用,而Vim又用的不太順手,突然想到最初用vs的時(shí)候有一個(gè)基于Linux的C++開(kāi)發(fā)。本文就來(lái)介紹一下,感興趣的可以了解一下
    2021-07-07

最新評(píng)論