順序表的增刪查改及OJ練習題

2021-10-02 07:41:05 字數 4031 閱讀 3668

順序表的增刪查改及oj練習題

1.順序表

#include"seqlist.h"

// 順序表初始化

void seqlistinit(seqlist* psl)

// 順序表銷毀

void seqlistdestory(seqlist* psl)

// 檢查空間,如果滿了,進行增容

void checkcapacity(seqlist* psl)

}// 順序表列印

void seqlistprint(seqlist* psl)

printf("\n");

}// 順序表尾插

void seqlistpushback(seqlist* psl, sldatatype x)

// 順序表尾刪

void seqlistpopback(seqlist* psl)

// 順序表頭插

void seqlistpushfront(seqlist* psl, sldatatype x)

psl->array[0] = x;

psl->size++;

}// 順序表頭刪

void seqlistpopfront(seqlist* psl)

psl->size--;

}// 順序表查詢

int seqlistfind(seqlist* psl, sldatatype x)

return -1;

}// 順序表在pos位置插入x

void seqlistinsert(seqlist* psl, size_t pos, sldatatype x)

psl->array[pos] = x;

psl->size++;

}// 順序表刪除pos位置的值

void seqlisterase(seqlist* psl, size_t pos)

psl->size--;

}

2.原地移除陣列中所有的元素val,要求時間複雜度為o(n),空間複雜度為o(1)

解題思路:

用雙指標,遍歷陣列,如果遇到值和val值相等則++src,如果值不行等則讓src的值覆蓋sub,兩個指標再加一步,當遍歷完陣列時剩下的內容和長度滿足題意。

int removeelement(int* nums, int numssize, int val)

return sub;

}

3.給定乙個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。

不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 o(1) 額外空間的條件下完成。

解題思路:

這道題和上面的題類似,設前後指標後面的指向的值如果和前乙個指標指向的值相同則進行刪除,讓後乙個繼續走,直到遇到不相同的數字,因為相同值要保留乙個,讓第二指標所指向不同值賦給第乙個指標+1指向的內容即可。

int removeduplicates(int* nums, int numssize)

else

}return one+1;

}

4.給定兩個有序整數陣列 nums1 和 nums2,將 nums2 合併到 nums1 中,使得 num1 成為乙個有序陣列。

說明:初始化 nums1 和 nums2 的元素數量分別為 m 和 n。

你可以假設 nums1 有足夠的空間(空間大小大於或等於 m + n)來儲存 nums2 中的元素。

解題思路:

因為兩個陣列有序如果從前向後排序必然會出現覆蓋或者順序紊亂情況,如果從後向前遍歷兩個陣列則可以有效避免這種情況發生。比較誰的值大就放到陣列最後,兩個陣列依次向前比較,最後可能出現2種情況:

(1)如果nums1中的值比較完成全部插入陣列中,剩下nums2的一部分,則將剩餘部分繼續向前遍歷插入陣列即可;

(2)相反如果nums2遍歷完成剩下nums1,因為現在插入的陣列是nums1,剩下的部分就是最小的幾個數,所以不用動,本來nums1就是有序的陣列。

void merge(int* nums1, int nums1size, int m, int* nums2, int nums2size, int n)

while(len2>=0)

}

5.給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。

示例 1:

輸入: [1,2,3,4,5,6,7] 和 k = 3

輸出: [5,6,7,1,2,3,4]

解釋:向右旋轉 1 步: [7,1,2,3,4,5,6]

向右旋轉 2 步: [6,7,1,2,3,4,5]

向右旋轉 3 步: [5,6,7,1,2,3,4]

解題思路:

這個題按照示例邏輯非常容易實現,下面是這個題的另一種思維方式;既然是旋轉陣列則本質就是陣列的逆置,只不過旋轉逆置乙個而已。

原陣列

先逆置numsize-k-1

先逆置numsize-k-1 

再逆置numsize-1-----numsize-1部分

最後整體逆置

6.對於非負整數 x 而言,x 的陣列形式是每位數字按從左到右的順序形成的陣列。例如,如果 x = 1231,那麼其陣列形式為 [1,2,3,1]。

給定非負整數 x 的陣列形式 a,返回整數 x+k 的陣列形式。

解題思路:

讓我們逐位將數字加在一起。舉乙個例子,如果要計算 123 與 912的和。我們順次計算 3+2、2+1、1+9。任何時候,當加法的結果大於等於 10,我們要將進製的 1 加入下一位的計算中去,所以最終結果等於 1035。我們把它表示成 [1, 2, 3+912]。然後,我們計算3+912=915。5留在當前這一位,將 910/10=91 以進製的形式加入下一位。然後,我們再重複這個過程,計算 [1, 2+91, 5]。我們得到 93,3 留在當前位,將90/10=9 以進製的形式加入下一位。繼而又得到 [1+9, 3, 5],重複這個過程之後,最終得到結果 [1, 0, 3, 5]。

/**

* note: the returned array must be malloced, assume caller calls free().

*/int* addtoarrayform(int* a, int asize, int k, int* returnsize)

int x2 = 0;

//如果k大於0,獲取k的每一位

if(k > 0)

//對應位置相加 如果滿足進製

int ret = x1 + x2 + next;

if(ret > 9)

else

addret[reti++] = ret;

}if(next == 1)

reverse(addret,0,reti-1);

*returnsize = reti;

return addret;

}void reverse(int* nums,int left,int right)

}

順序表的增刪查改

今天來實現簡單的順序表地增刪查詢操作 1.在開始敲 前,首先要明確自己要幹嘛。2.然後開始構思自己所要實現什麼樣的功能。3.之後將之前構思的功能弄好框架。4.最後再將每個框架的內容補充上。標頭檔案 include pragma once include typedef int sldatatype ...

順序表的增刪查改

順序表實現 順序表是用一段實體地址連續的儲存單元依次儲存的線性結構,一般情況下採用陣列儲存。在陣列上完成資料的增刪查改。靜態順序表 使用定長陣列儲存 動態順序表 使用動態開闢的陣列儲存 靜態順序表適用於確定知道需要存多少資料的場景。靜態順序表的定長陣列導致n定大了,空間開多了浪費,開少了不夠用。首先...

實現順序表的增刪查改

線性表分為兩種 順序表 順序儲存 和鍊錶 鏈式儲存 這裡實現一下順序表管理資料的增刪查改操作 標頭檔案自定義標頭檔案中一般存放自定義函式的函式宣告 sqlist.h pragma once include include include typedef int sqldatatype typedef...