asp网站开发实训总结,现在创业什么行业最好,如何登录公众号平台,南阳教育网站平台题目描述
给定一个整数数组 nums#xff0c;将数组中的元素向右轮转 k 个位置#xff0c;其中 k 是非负数。
示例 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…题目描述
给定一个整数数组 nums将数组中的元素向右轮转 k 个位置其中 k 是非负数。
示例 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: 输入nums [-1,-100,3,99], k 2 输出[3,99,-1,-100] 解释: 向右轮转 1 步: [99,-1,-100,3] 向右轮转 2 步: [3,99,-1,-100] 提示
1 nums.length 105-231 nums[i] 231 - 10 k 105
进阶
尽可能想出更多的解决方案至少有 三种 不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗
解题方案
C 一步步移动会超时
void rotate(int* nums, int numsSize, int k) {int temp 0;k k % numsSize;while (k) {temp nums[numsSize - 1];for (int i numsSize - 2; i 0; i--) {nums[i 1] nums[i];}nums[0] temp;k--;}
}C 使用临时数组
void rotate(int* nums, int numsSize, int k) {int temp[numsSize]; //定义一个临时数组// 将轮转后的数组放到临时数组种for (int i 0; i numsSize; i) {temp[(i k) % numsSize] nums[i];}// 将临时数组更新到原数组中for (int i 0; i numsSize; i) {nums[i] temp[i];}
}C 直接数组翻转
void reverse(int *nums, int begin, int end) // 翻转函数
{while(begin end){int temp nums[begin];nums[begin] nums[end];nums[end] temp;begin;end--;}
}void rotate(int* nums, int numsSize, int k)
{k k % numsSize; // 计算实际移动的位数reverse(nums, 0, numsSize - 1); // 翻转整个数组reverse(nums, 0, k - 1); // 翻转前部分数组reverse(nums, k, numsSize - 1); // 翻转后部分数组
}