首頁 > 軟體

C語言超詳細講解輪轉陣列

2022-04-01 19:02:26

題目描述

給你一個陣列,將陣列中的元素向右輪轉 k 個位置,其中 k 是非負數。OJ連結

範例

1.範例1

輸入: nums = [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]

2.範例2

輸入:nums = [-1,-100,3,99], k = 2
輸出:[3,99,-1,-100]
解釋: 
向右輪轉 1 步: [99,-1,-100,3]
向右輪轉 2 步: [3,99,-1,-100]

解題思路

為了使演演算法空間複雜度為O(1),原地旋轉,所以不能額外建立陣列。

以範例1為例子。使用三次逆轉法,讓陣列旋轉k次

  • 先整體逆轉 變為(7,6,5,4,3,2,1)
  • 逆轉子陣列[0, k - 1] 變為(5,6,7,4,3,2,1)
  • 逆轉子陣列[k, numsSize - 1] 變為(5,6,7,1,2,3,4)

1. 先整體逆轉

設定兩個指標變數分別指向頭部和尾部。當 begin<end 時,交換兩個位置上的值。綠色的數位為交換的位置。

2.逆轉子陣列[0, k - 1]

3.逆轉子陣列[k, numsSize - 1]

此處不贅述、同上面兩個步驟的思路。這樣就完成了對陣列的輪轉。

易錯點

假如需要輪轉的個數k大於陣列numsSize的長度呢?

假如k為10,那麼本題的結果是什麼呢?

假如右旋10個數,那麼先旋7個後將又回到了原來的樣子。 然後再旋3個的話那麼將和本題的旋3個一模一樣。

  • 本題的精髓就是題目,叫做輪轉陣列。果然天道好輪迴。輪轉7次又回到了起點。輪轉14次,21次…,只要七的倍數都回返回原地。
  • 所以在題目中要加入是否為k的倍數的判斷程式碼
	if (k > numsSize)
	{
		k %= numsSize;
	}

程式碼

此程式碼帶主函數。LeetCode題目中是介面型別的不帶主函數。因為要輪轉三次。所以把while迴圈寫成一個函數,方便複用。

 LeetCode189. 輪轉陣列
#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個數,先旋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;
}

到此這篇關於C語言超詳細講解輪轉陣列的文章就介紹到這了,更多相關C語言 輪轉陣列內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com