🔥個人主頁:艾莉絲努力練劍
?專欄傳送門:《C語言》、《數據結構與算法》、C語言刷題12天IO強訓
🍉學習方向:C/C++方向
??人生格言:為天地立心,為生民立命,為往圣繼絕學,為萬世開太平
前言:牛客網和LeetCode的刷題都不可或缺,我們都做一做,力扣的題目對提升代碼能力很有幫助,需要有一點基礎,幾乎都是接口型的題目,在C語言刷題專欄我好像還沒有介紹過這兩者的區別,那么我們來了解一下——IO型和接口型都是在線OJ的編程形式,區別在于:IO型:輸入輸出格式處理,又被稱為輸入輸出型;
接口型:特定功能模塊的邏輯實現,又被稱為函數實現型。
解釋一下,IO型就是輸入輸出要程序員自己寫,接口型則不需要。?
目錄
正文
一、用數組逆置方法求解輪轉數組
二、malloc實現數組串聯
三、異或方法求解消失的數字
結尾
正文
每一道題,博主都在力扣網站寫了題解,博主會把網址放到每個版塊開頭。
一、用數組逆置方法求解輪轉數組
189. 輪轉數組 - 力扣(LeetCode)
這道題是我們的老熟人了,我在介紹數據結構與算法中的算法復雜度一文中就分三種思路介紹過輪轉數組這道題了,所以在本文中博主就不贅述了,直接上鏈接!
【數據結構】詳解算法復雜度:時間復雜度和空間復雜度
思路
你選用何種方法解題?數組逆置
解題過程
這些方法具體怎么運用?先逆置后k次,再逆置前nums-k次,最后再整體逆置
復雜度
- 時間復雜度:O(n)?
- 空間復雜度:O(1)
代碼演示——
// void my_reverse(int*nums,int left,int right)
// {
// while(left < right)
// {
// int tmp = nums[left];
// nums[left] = nums[right];
// nums[right] = tmp;// left++;
// right--;
// }
// }// void rotate(int*nums,int numsSize,int k)
// {
// k = k % numsSize;
// my_reverse(nums,0,numsSize-k-1);
// my_reverse(nums,numsSize-k,numsSize-1);
// my_reverse(nums,0,numsSize-1);
// }void my_reverse(int*nums,int left,int right)
{while(left < right){int tmp = nums[left];nums[left] = nums[right];nums[right] = tmp;left++;right--;}
}void rotate(int*nums,int numsSize,int k)
{if(k >= numsSize){k = k % numsSize;}my_reverse(nums,0,numsSize-k-1);my_reverse(nums,numsSize-k,numsSize-1);my_reverse(nums,0,numsSize-1);
}
二、malloc實現數組串聯
1929. 數組串聯 - 力扣(LeetCode)
思路
你選用何種方法解題?malloc開辟空間,for循環遍歷數組
解題過程
這些方法具體怎么運用?malloc開辟大小為numsSize*sizeof(int)*2的空間,再強制類型轉換,for循環遍歷數組,用題目所給的串聯數組關系,就可以了
復雜度
- 時間復雜度:O(n)
- 空間復雜度:O(1)
代碼演示——
/*** Note: The returned array must be malloced, assume caller calls free().*/
int* getConcatenation(int* nums, int numsSize, int* returnSize)
{int *ans = (int *)malloc(numsSize*sizeof(int)*2);for(int i = 0;i < numsSize;i++){ans[i] = nums[i];ans[i + numsSize] = nums[i];}*returnSize = numsSize * 2;return ans;
}?
三、異或方法求解消失的數字
面試題 17.04. 消失的數字 - 力扣(LeetCode)
思路
你選用何種方法解題?異或
解題過程
這些方法具體怎么運用?for循環,然后異或,因為異或是相同為0,相異為1,我們就可以這么想——數組中的數依次跟0-N的所有數異或,最后剩下的那個數字就是缺的那個數字
復雜度
- 時間復雜度:O(n)
- 空間復雜度:O(1)
?int missingNumber(int* nums, int numsSize)
{int x = 0;for(int i = 0;i < numsSize;++i){x ^= nums[i];}for(int j = 0;j < numsSize + 1;++j){x ^= j;}?
結尾
結語:本篇文章到這里就結束了,大家一定要自己動手敲一敲,不敲的話容易忘記。