【解题报告】《九日集训》(第四天)

语言:C++

全是水题的一天

目录

  • 1470. 重新排列数组
  • 1929. 数组串联
  • 1920. 基于排列构建数组
  • 1480. 一维数组的动态和
  • 剑指 Offer 58 - II. 左旋转字符串
  • 1108. IP 地址无效化
  • 剑指 Offer 05. 替换空格
  • 1365. 有多少小于当前数字的数字
  • 剑指 Offer 17. 打印从1到最大的n位数
  • 1389. 按既定顺序创建目标数组

1470. 重新排列数组

1470. 重新排列数组

给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。

请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。

示例 1:

输入: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]

找规律

class Solution
{
public:
	vector<int> shuffle(vector<int>& nums, int n)
	{
		vector<int>ret(nums.size());
		for (int i = 0; i < nums.size(); ++i)
		{
			if (i & 1)
			{
				ret[i] = nums[i / 2 + n];
			}
			else
				ret[i] = nums[i / 2];
		}
		return ret;
	}
};

1929. 数组串联

1929. 数组串联

给你一个长度为 n 的整数数组 nums 。请你构建一个长度为 2n 的答案数组 ans ,数组下标 从 0 开始计数 ,对于所有 0 <= i < ni ,满足下述所有要求:

  • ans[i] == nums[i]
  • ans[i + n] == nums[i]

具体而言,ans 由两个 nums 数组 串联 形成。

返回数组 ans

示例 1:

输入: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]

法一:新建数组

class Solution
{
public:
    vector<int> getConcatenation(vector<int>& nums)
    {
        vector<int>ret(nums.size() * 2);
        for (int i = 0; i < nums.size(); i++)
        {
            ret[i] = ret[i + nums.size()] = nums[i];
        }
        return ret;
    }
};

发现效率很慢,就跑去瞥了一眼题解

法二:直接在nums后边push就行

class Solution
{
public:
	vector<int> getConcatenation(vector<int>& nums)
	{
		int n = nums.size();
		for (int i = 0; i < n; ++i)
		{
			nums.push_back(nums[i]);
		}
		return nums;
	}
};

1920. 基于排列构建数组

1920. 基于排列构建数组

给你一个 从 0 开始的排列 nums下标也从 0 开始)。请你构建一个 同样长度 的数组 ans ,其中,对于每个 i0 <= i < nums.length),都满足 ans[i] = nums[nums[i]] 。返回构建好的数组 ans

从 0 开始的排列 nums 是一个由 0nums.length - 10nums.length - 1 也包含在内)的不同整数组成的数组。

示例 1:

输入:nums = [0,2,1,5,3,4]
输出:[0,1,2,4,5,3]
解释:数组 ans 构建如下:
ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]
= [nums[0], nums[2], nums[1], nums[5], nums[3], nums[4]]
= [0,1,2,4,5,3]

按照题意写

class Solution
{
public:
	vector<int> buildArray(vector<int>& nums)
	{
		vector<int>ret(nums.size());
		for (int i = 0; i < nums.size(); ++i)
		{
			ret[i] = nums[nums[i]];
		}
		return ret;
	}
};

1480. 一维数组的动态和

1480. 一维数组的动态和

给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i])

请返回 nums 的动态和。

示例 1:

输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。

nums[i] += nums[i - 1]

class Solution
{
public:
    vector<int> runningSum(vector<int>& nums)
    {
        for (int i = 0; i < nums.size(); ++i)
        {
            if (i == 0)
                continue;
            nums[i] += nums[i - 1];
        }
        return nums;
    }
};

剑指 Offer 58 - II. 左旋转字符串

剑指 Offer 58 - II. 左旋转字符串

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:

输入: s = “abcdefg”, k = 2
输出: “cdefgab”

这个题在C++里直接调用函数就行

class Solution 
{
public:
    string reverseLeftWords(string s, int n) 
    {
        string s1;
        s1.append(s.begin() + n, s.end());
        s1.append(s.begin(), s.begin() + n);
        return s1;
    }
};

1108. IP 地址无效化

1108. IP 地址无效化

给你一个有效的 IPv4 地址 address,返回这个 IP 地址的无效化版本。

所谓无效化 IP 地址,其实就是用 "[.]" 代替了每个 "."

示例 1:

输入:address = “1.1.1.1”
输出:“1[.]1[.]1[.]1”

一个比较笨的写法

class Solution 
{
public:
    string defangIPaddr(string address) 
    {
        string s = "[.]";
        string s1;
        for (auto n : address)
        {
            if (n != '.')
            {
                s1.push_back(n);
            }
            else
                s1.append(s);
        }
        return s1;
    }
};

剑指 Offer 05. 替换空格

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

示例 1:

输入:s = “We are happy.”
输出:“We%20are%20happy.”

和1108题一样

class Solution 
{
public:
    string replaceSpace(string s) 
    {
        string s1 = "%20";
        string s2;
        for (auto n : s)
        {
            if (n == ' ')
            {
                s2.append(s1);
            }
            else
                s2.push_back(n);
        }
        return s2;
    }
};

1365. 有多少小于当前数字的数字

1365. 有多少小于当前数字的数字

给你一个数组 nums,对于其中每个元素 nums[i],请你统计数组中比它小的所有数字的数目。

换而言之,对于每个 nums[i] 你必须计算出有效的 j 的数量,其中 j 满足 j != i nums[j] < nums[i]

以数组形式返回答案。

示例 1:

输入:nums = [8,1,2,2,3]
输出:[4,0,1,1,3]
解释:
对于 nums[0]=8 存在四个比它小的数字:(1,2,2 和 3)。
对于 nums[1]=1 不存在比它小的数字。
对于 nums[2]=2 存在一个比它小的数字:(1)。
对于 nums[3]=2 存在一个比它小的数字:(1)。
对于 nums[4]=3 存在三个比它小的数字:(1,2 和 2)。

朴素方法:两层循环

class Solution
{
public:
    vector<int> smallerNumbersThanCurrent(vector<int>& nums)
    {
        vector<int>ret(nums.size(), 0);
        for (int i = 0; i < nums.size(); i++)
        {
            for (int j = 0; j < nums.size(); j++)
            {
                if (nums[j] < nums[i])
                {
                    ret[i]++;
                }
            }
        }
        return ret;
    }
};

剑指 Offer 17. 打印从1到最大的n位数

剑指 Offer 17. 打印从1到最大的n位数

输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

示例 1:

输入: n = 1
输出: [1,2,3,4,5,6,7,8,9]

注意点:n位数+从1开始

class Solution
{
public:
	vector<int> printNumbers(int n)
	{
		vector<int>ret;
		for (int i = 0; i < pow(10,n)-1; i++)
		{
			ret.push_back(i + 1);
		}
		return ret;
	}
};

1389. 按既定顺序创建目标数组

1389. 按既定顺序创建目标数组

给你两个整数数组 numsindex。你需要按照以下规则创建目标数组:

  • 目标数组 target 最初为空。
  • 按从左到右的顺序依次读取 nums[i]index[i],在 target 数组中的下标 index[i] 处插入值 nums[i]
  • 重复上一步,直到在 numsindex 中都没有要读取的元素。

请你返回目标数组。

题目保证数字插入位置总是存在。

示例 1:

输入:nums = [0,1,2,3,4], index = [0,1,2,2,1]
输出:[0,4,1,3,2]
解释:
nums index target
0 0 [0]
1 1 [0,1]
2 2 [0,1,2]
3 2 [0,1,3,2]
4 1 [0,4,1,3,2]

insert函数:insert(where, value)

class Solution 
{
public:
    vector<int> createTargetArray(vector<int>& nums, vector<int>& index)
    {
        vector<int>target;
        for (int i = 0; i < nums.size(); ++i)
        {
            target.insert(target.begin() + index[i], nums[i]);
        }
        return target;
    }
};

你可能感兴趣的:(集训,leetcode,哈希算法,算法)