剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数相关的知识,希望对你有一定的参考价值。


前言

剑指 Offer 45. 把数组排成最小的数
剑指 Offer 61. 扑克牌中的顺子
剑指 Offer 40. 最小的k个数


一、示例

1.剑指 Offer 45. 把数组排成最小的数

/*输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"

示例 2
输入: [3,30,34,5,9]
输出: "3033459"*/

2.剑指 Offer 61. 扑克牌中的顺子

/*从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,
A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5]
输出: True

示例 2:
输入: [0,0,1,2,5]
输出: True*/

3.剑指 Offer 40. 最小的k个数

/*输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]*/
/*法一---数组排序*/

二、代码解析

1.新建.cpp文件

代码如下(示例):

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
#include <queue>
using namespace std;


/*输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2]
输出: "102"

示例 2
输入: [3,30,34,5,9]
输出: "3033459"*/
string minNumber(vector<int>& nums)
{
	int len = nums.size();
	string res = "";
	if (len == 0)return res;
	vector<string> tmpStr;
	for (int i = 0; i < len; ++i)
	{
		tmpStr.push_back(to_string(nums[i]));
	}
	sort(tmpStr.begin(), tmpStr.end(), [](string& x, string& y) {return x + y < y + x; });
	for (int i = 0; i < len; ++i)
	{
		res.append(tmpStr[i]);
	}

	return res;
}
/*从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,
A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5]
输出: True

示例 2:
输入: [0,0,1,2,5]
输出: True*/
bool isStraight1(vector<int>& nums)
{
	sort(nums.begin(), nums.end());

	int k = 0;
	for (int i = 0; i < nums.size() - 1; ++i)
	{
		if (nums[i] == 0)
		{
			++k;
			continue;
		}
		if (nums[i] == nums[i + 1])
		{
			return false;
		}
		if (nums[i] + 1 == nums[i + 1])
		{
			continue;
		}
		if (nums[i] + 1 < nums[i + 1])
		{
			k -= nums[i + 1] - nums[i] - 1;
			if (k < 0)
			{
				return false;
			}
		}
	}
	return true;
}
/*输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
示例 1:
输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

示例 2:
输入:arr = [0,1,2,1], k = 1
输出:[0]*/
/*法一---数组排序*/
vector<int> getLeastNumbers1(vector<int>& arr, int k)
{
	vector<int> nums;
	sort(arr.begin(), arr.end());
	for (int i = 0; i < k; ++i)
	{
		nums.push_back(arr[i]);
	}
	return nums;
}
/*法二---堆降序*/
vector<int> getLeastNumbers2(vector<int>& arr, int k)
{
	vector<int> res(k, 0);
	if (k == 0) return res;
	priority_queue<int, vector<int>, less<int>> Q;
	for (int i = 0; i < k; ++i)
	{
		Q.push(arr[i]);
	}

	for (int i = k; i < arr.size(); ++i)
	{
		if (Q.top() > arr[i])
		{
			Q.pop();
			Q.push(arr[i]);
		}
	}

	for (int i = 0; i < k; ++i)
	{
		res[i] = Q.top();
		Q.pop();
	}

	return res;
}


int main(void)
{
	cout << "剑指 Offer 45. 把数组排成最小的数" << endl;
	vector<int> nums = { 1,2,3,4,5 };
	cout << "法一----->" << minNumber(nums) << endl << endl;

	cout << "剑指 Offer 61. 扑克牌中的顺子" << endl;
	cout << "法一----->" << isStraight1(nums) << endl << endl;

	cout << "剑指 Offer 40. 最小的k个数" << endl;
	vector<int> arr = { 1,2,3,4,5,1,3,6,9 };
	vector<int> res1 = getLeastNumbers1(arr, 2);
	vector<int> res2 = getLeastNumbers2(arr, 2);

	cout << "法一--数组排序--->" << endl;
	for (int i = 0; i < res1.size(); ++i)
	{
		cout << res1[i] << " ";
	}
	cout << endl;
	cout << "法二--堆降序--->" << endl;
	for (int i = 0; i < res2.size(); ++i)
	{
		cout << res2[i] << " ";
	}
	return 0;
}

三,测试


以上是关于剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数的主要内容,如果未能解决你的问题,请参考以下文章

Java 剑指offer(45) 把数组排成最小的数

剑指offer45把数组排成最小的数

算法剑指 Offer 45. 把数组排成最小的数 重刷

剑指 Offer 45. 把数组排成最小的数

[LeetCode]剑指 Offer 45. 把数组排成最小的数

[LeetCode]剑指 Offer 45. 把数组排成最小的数