题目如下:
题目的意思其实比较清楚了:重新排列的数组中,偶数位置的元素从n开始,奇数位置从0开始。
故而有如下代码:
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
int *results = (int *)malloc(numsSize * sizeof(int));//重新分配内存
int count=2;//用于控制区分偶数位和奇数位
for(int k=0,i=0,j=n;k<numsSize;k++)//i从0开始,j从n开始
{
if(count%2==0)//如果是偶数位(包括0)
{
results[k]=nums[i];//从0开始计数
i++;
}
else//如果是奇数位
{
results[k]=nums[j];//从n开始计数
j++;
}
count++;//奇偶交替
}
*returnSize = numsSize;
return results;//返回结果数组
}
这题虽然简单,可有时候越是简单的题目越考验逻辑。刚开始做的时候脑子没反应过来,把i和j放到for循环的条件里去了,结果一直得不到想要的答案,然后把i和j单独分开,分别执行++操作,这才是正确的逻辑。
然后看了一下题解,发现了一个更为简洁的写法:
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
int* res=(int*)malloc(sizeof(int)*numsSize);
*returnSize=numsSize;
for(int i=0;i<n;i++){
res[2*i]=nums[i];
res[2*i+1]=nums[n+i];
//0->0 1->2 2->4 3->6 nums[i]->nums[2i]
//4(0)->1 5(1)->3 6(2)->5 7(3)->7 nums[4+i]->nums[2*i+1]
//[0,1,2,3,0,1,2,3]
//[0,0,1,1,2,2,3,3]
}
return res;
}
作者:fu-chen-h
链接:https://leetcode-cn.com/problems/shuffle-the-array/solution/cyu-yan-9241-6062-by-fu-chen-h-biai/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
核心就在于两行:
唉,是我又想复杂了,这个规律竟然没发现。