- 说几句
- 写题
- 数组串联
- 重新排列数组
- 总结
说几句
今天,还可以早上上操,6点30集合,我5.30起床累啊,昨天敲代码到半夜1点,拖着疲惫的身体起床洗脸,唉,好的一点是今天码神联系了雨神,几天下雨了,哈哈,第二天就下雨了,所以我休息,今天多敲几题,我希望下午也能下雨,不是为了别的,只是为了好好的收拾一下自己的内务,今天我们来看简单的malloc算法,来自英雄老师整理的题,可以去看:csdn:英雄从哪里出来。
写题 数组串联给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,对于所有 0 <= i < n 的 i ,满足下述所有要求:
- ans[i] == nums[i]
- ans[i + n] == nums[i]
具体而言,ans 由两个 nums 数组 串联 形成。
输入:nums = [1,2,1]
输出:[1,2,1,1,2,1]
解释:数组 ans 按下述方式形成:
- ans = [nums[0],nums[1],nums[2],nums[0],nums[1],nums[2]]
- ans = [1,2,1,1,2,1]
分析:
- 根据题意来看一层枚举即可,这个问题需要返回,是一个数组,一般情况下可以使用malloc申请存储,如果没有学过stl的话,本着从简到繁的态度,我们先来看最简单的写法
int* get(int* nums, int numsSize, int* returnSize)
{
int i;
int *ret = new int (numsSize * sizeof(int));
//int *ret = (int*) malloc (numsSize * sizeof(int))
*returnSize = 2 * numsSize;
for (i = 0; i < numsSize; ++i)
{
ret[i + numsSize] = ret[i] = nums[i];
}
return ret;
}
下面展示真正的技术,排水渠过弯
class Solution
{
public:
vectorget(vector&nums)
{
int n = nums.size;
for (int i = 0; i < n; i++)
{
nums.push_back(nums[i]);
}
return nums;
}
};
重新排列数组
给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,…,xn,y1,y2,…,yn] 的格式排列。
请你将数组按 [x1,y1,x2,y2,…,xn,yn] 格式重新排列,返回重排后的数组。
- 输入:nums = [2,5,1,3,4,7], n = 3
输出:[2,3,5,4,1,7]
解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]
来简单的说一下他的意思吧,意思是如果x1……y1一一对应,那么有俩种情况
- 奇数:如果i为奇数,则为原先第n+i/2个位置上的值
- 偶数:如果i为偶数,则为原来第i+1 /2个位置的值
class Solution {
public:
vector shuffle(vector& nums, int n) {
for(int i = 0; i < 2 * n; i ++)
if(nums[i] > 0){
// j 描述当前的 nums[i] 对应的索引,初始为 i
int j = i;
while(nums[i] > 0){
// 计算 j 索引的元素,也就是现在的 nums[i],应该放置的索引
j = j < n ? 2 * j : 2 * (j - n) + 1;
// 把 nums[i] 放置到 j 的位置,
// 同时,把 nums[j] 放到 i 的位置,在下一轮循环继续处理
swap(nums[i], nums[j]);
// 使用负号标记上,现在 j 位置存储的元素已经是正确的元素了
nums[j] = -nums[j];
}
}
for(int& e: nums) e = -e;
return nums;
}
};
总结
今天,出去喝了一点,哈哈,我说的是喝了一点。。。明天看吧



