劍指offer 關於陣列的簡單題練習

2021-10-07 15:50:30 字數 4138 閱讀 8331

1.1題目描述

輸入乙個整數陣列,實現乙個函式來調整該陣列中數字的順序,使得所有奇數字於陣列的前半部分,所有偶數字於陣列的後半部分。

示列:

輸入:nums = [1,2,3,4]

輸出:[1,3,2,4]

注:[3,1,2,4] 也是正確的答案之一。

1.2題目分析方法一:利用快慢指標定義兩個指標low和fast,都從下標為0的位置開始

只要fast沒有陣列越界,fast指標一直向前遍歷

遇到low指標的元素是偶數並且fast指向的元素是奇數就交換這兩個指標所指向的值

只有遇到low指向的元素不是偶數的時候,low指標才往前遍歷

以例子陣列來說,具體的過程如下:

**實現:

void

swap

(int

& a,

int& b)

vector<

int>

exchange

(vector<

int>

& nums)

if(nums[low]%2

!=0) fast++;}

return nums;

}

方法二:雙指標定義兩個指標low和high。low從陣列的頭部開始找偶數,high從陣列的尾部開始找奇數

直到low>=high時退出尋找

**實現:

vector<

int>

exchange1

(vector<

int>

& arr)

if(arr[high]%2

==0)swap

(arr[low]

, arr[high]);

}return arr;

}int

main()

return0;

}

1、題目要求統計乙個數字在排序陣列**現的次數。

示例1

輸入: nums = [5,7,7,8,8,10], target = 8

輸出: 2

示例2

輸入: nums = [5,7,7,8,8,10], target = 6

輸出: 0

2、題目分析方法一:挨個遍歷查詢這樣做的時間複雜度最高,可達o(n)

int

search

(vector<

int>

& nums,

int target)

return count;

}

方法二:巧用二分查詢基於上乙個方法時間複雜度太高,並且沒有充分利用陣列排序的特點,所以採用二分查詢的方式來求解,時間複雜度是o(logn)

定義兩個指標,low指向陣列的頭部,high指向陣列的尾部

利用二分查詢的方式,判斷陣列中間mid所指的數字是否和目標元素相同

如果相同的話,利用陣列排序的特點,目標元素的相鄰元素一定和目標元素是相同的,分別在左右子陣列中統計和目標數字相同的數字個數lcount和rcount

最後返回值為lcount+rcount+1

具體的,以下面以 nums = [5,7,7,8,8,10], target = 8這個例子加以分析

注意!!

還有特殊情況的處理,如果陣列中沒有元素應該return -1

int

search1

(vector<

int>

& arr,

int target)

int low =0;

int high = arr.

size()

-1;int countl =0;

int countr =0;

int count =0;

while

(low <= high)

while

(rlow < high && arr[

++rlow]

== target)

count = countl + countr +1;

break;}

}return count;

}

1、題目要求乙個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0~n-1之內。在範圍0~n-1內的n個數字中有且只有乙個數字不在該陣列中,請找出這個數字。

示例1:

輸入: [0,1,3]

輸出: 2

示例2:

輸入: [0,1,2,3,4,5,6,7,9]

輸出: 8

限制:1 <= 陣列長度 <= 10000

2、題目分析

注意!:[0,1]表示陣列長度為n-1=2,所以n=3,共有3個數字,所以在之間的是[0,1,2];不能理解為只有2個數字,不缺失數字。這一點很重要。

方法一:兩次迴圈

第一次迴圈得到0~n-1的總和sum1,第二次迴圈得到陣列元素的總和sum2

返回sum1-sum2,即為缺失的那個數

但是這種方法不可取,時間複雜度太高,沒有充分利用陣列有序的特點

**實現:

int

missingnumber

(vector<

int>

& arr)

for(

int j =

0; j < arr.

size()

; j++

)return sum1 - sum2;

}

方法二:一次迴圈根據陣列排列有序的特點。沒有缺失的數字一定是和其下標一一對應的

如果遇到沒有對應的數字則表示該下標對應的數字缺失

如果陣列遍歷完畢都沒找到缺失的數字,說明是陣列最後乙個數字缺失。返回arr.size()的值

**實現如下:

int

missingnumber1

(vector<

int>

& arr)

return arr.

size()

;}

方法三:二分查詢二分查詢的思路還是根據下標和陣列中的值來判斷缺失元素。但是相比於方法三更好的是一次可以捨棄一半的資料

如果==mid等於arr[mid]==的值相等的話,表示在mid之前都是按照順序沒有缺失存放的,那麼就在後半邊陣列中去尋找,high = mid+1.

如果mid和arr[mid]的值不相等的話。比較mid-1和arr[mid-1]的值是否相等

3.1如果相等就表示mid即為缺失的數字

3.2如果不相等,則表示缺失的值,在mid前面。讓high = mid-1

查詢到最後返回值的**。返回值不應該是mid。比如下面這個例子

所以二分查詢跳出迴圈過後需要返回low,而不是mid.

**實現如下:

int

missingnumber2

(vector<

int>

& arr)

else

//左半部分有問題

}return low;

}int

main()

劍指offer 簡單題

用兩個棧來實現乙個佇列,完成佇列的push和pop操作。佇列中的元素為int型別。思路 變向隻變一次,s2空了之後再把s1全部搬過去 class solution int pop key stack2.top stack2.pop return key private stackstack1 sta...

劍指offer 簡單題 一

因為這幾題太簡單了,總結一下思路就行了。知識點 陣列 其實就是for迴圈加個判斷條件。牛客上有人呼叫了一些大數之類的api,感覺沒啥必要。為了ac可以,面試的時候這樣是真的秀逗了。給定乙個陣列a 0,1,n 1 請構建乙個陣列b 0,1,n 1 其中b中的元素b i a 0 a 1 a i 1 a ...

劍指offer 陣列

資料是最簡單的資料結構,它佔據一塊連續的記憶體並按照順序儲存資料。建立陣列時,首先指點陣列的容量大小,然後根據大小分配記憶體。缺點 空間效率不高。經常有空閒的區域滅有得到充分利用。優點 時間效率很高。可以根據時間效率高的特點,來實現簡單的雜湊表 把陣列的下標設為雜湊表的鍵值,陣列中的每乙個數字設為雜...