栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

码神军训写算法(二)malloc——三连写

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

码神军训写算法(二)malloc——三连写

文章目录
  • 说几句
  • 写题
    • 数组串联
    • 重新排列数组
  • 总结


说几句

今天,还可以早上上操,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一一对应,那么有俩种情况

  1. 奇数:如果i为奇数,则为原先第n+i/2个位置上的值
  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;
    }
};

总结

今天,出去喝了一点,哈哈,我说的是喝了一点。。。明天看吧

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311821.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号