C語言超詳細(xì)講解輪轉(zhuǎn)數(shù)組
題目描述
給你一個數(shù)組,將數(shù)組中的元素向右輪轉(zhuǎn) k 個位置,其中 k 是非負(fù)數(shù)。OJ鏈接
實例
1.實例1
輸入: nums = [1,2,3,4,5,6,7], k = 3
輸出: [5,6,7,1,2,3,4]
解釋:
向右輪轉(zhuǎn) 1 步: [7,1,2,3,4,5,6]
向右輪轉(zhuǎn) 2 步: [6,7,1,2,3,4,5]
向右輪轉(zhuǎn) 3 步: [5,6,7,1,2,3,4]
2.實例2
輸入:nums = [-1,-100,3,99], k = 2
輸出:[3,99,-1,-100]
解釋:
向右輪轉(zhuǎn) 1 步: [99,-1,-100,3]
向右輪轉(zhuǎn) 2 步: [3,99,-1,-100]
解題思路
為了使算法空間復(fù)雜度為O(1),原地旋轉(zhuǎn),所以不能額外創(chuàng)建數(shù)組。
以實例1為例子。使用三次逆轉(zhuǎn)法,讓數(shù)組旋轉(zhuǎn)k次
- 先整體逆轉(zhuǎn) 變?yōu)?code>(7,6,5,4,3,2,1)
- 逆轉(zhuǎn)子數(shù)組[0, k - 1] 變?yōu)?code>(5,6,7,4,3,2,1)
- 逆轉(zhuǎn)子數(shù)組[k, numsSize - 1] 變?yōu)?code>(5,6,7,1,2,3,4)
1. 先整體逆轉(zhuǎn)
設(shè)置兩個指針變量分別指向頭部和尾部。當(dāng) begin<end 時,交換兩個位置上的值。綠色的數(shù)字為交換的位置。

2.逆轉(zhuǎn)子數(shù)組[0, k - 1]



3.逆轉(zhuǎn)子數(shù)組[k, numsSize - 1]
此處不贅述、同上面兩個步驟的思路。這樣就完成了對數(shù)組的輪轉(zhuǎn)。
易錯點
假如需要輪轉(zhuǎn)的個數(shù)k大于數(shù)組numsSize的長度呢?
假如k為10,那么本題的結(jié)果是什么呢?
假如右旋10個數(shù),那么先旋7個后將又回到了原來的樣子。 然后再旋3個的話那么將和本題的旋3個一模一樣。
- 本題的精髓就是題目,叫做輪轉(zhuǎn)數(shù)組。果然天道好輪回。輪轉(zhuǎn)7次又回到了起點。輪轉(zhuǎn)14次,21次…,只要七的倍數(shù)都回返回原地。
- 所以在題目中要加入是否為k的倍數(shù)的判斷代碼
if (k > numsSize)
{
k %= numsSize;
}
代碼
此代碼帶主函數(shù)。LeetCode題目中是接口類型的不帶主函數(shù)。因為要輪轉(zhuǎn)三次。所以把while循環(huán)寫成一個函數(shù),方便復(fù)用。
LeetCode189. 輪轉(zhuǎn)數(shù)組
#include<stdio.h>
void rotate1(int* begin, int* end)
{
while (begin < end)
{
int t = 0;
t = *begin;
*begin = *end;
*end = t;
++begin;
--end;
}
}
void rotate(int* nums, int numsSize, int k)
{
//假如右旋10個數(shù),先旋7個后又回到了原來的樣子。然后再旋3次的話和本題再旋3次一模一樣。
if (k > numsSize)
{
k %= numsSize;
}
int* begin = nums;
int* end = nums + numsSize - 1;
rotate1(begin, end);
rotate1(begin, begin+k-1);
rotate1(begin + k, end);
}
int main()
{
int nums[] = { 1,2,3,4,5,6,7 };
int sz = sizeof(nums) / sizeof(nums[0]);
rotate(nums, sz, 3);
for (int i = 0; i < sz; i++)
{
printf("%d ", nums[i]);
}
return 0;
}
到此這篇關(guān)于C語言超詳細(xì)講解輪轉(zhuǎn)數(shù)組的文章就介紹到這了,更多相關(guān)C語言 輪轉(zhuǎn)數(shù)組內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言數(shù)據(jù)結(jié)構(gòu)之vector底層實現(xiàn)機(jī)制解析
向量(Vector)是一個封裝了動態(tài)大小數(shù)組的順序容器(Sequence?Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象??梢院唵蔚恼J(rèn)為,向量是一個能夠存放任意類型的動態(tài)數(shù)組2021-11-11
C++實現(xiàn)當(dāng)前時間動態(tài)顯示的方法
這篇文章主要介紹了C++實現(xiàn)當(dāng)前時間動態(tài)顯示的方法,涉及C++時間操作及Sleep方法的使用,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07

