您好,登錄后才能下訂單哦!
今天小編給大家分享一下C語言輪轉數組問題怎么解決的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
給你一個數組,將數組中的元素向右輪轉 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)
設置兩個指針變量分別指向頭部和尾部。當 begin<end 時,交換兩個位置上的值。綠色的數字為交換的位置。
此處不贅述、同上面兩個步驟的思路。這樣就完成了對數組的輪轉。
假如需要輪轉的個數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語言輪轉數組問題怎么解決”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。