剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数
Posted 穿迷彩服的鲨鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子 剑指 Offer 40. 最小的k个数相关的知识,希望对你有一定的参考价值。
45. 把数组排成最小的数61. 扑克牌中的顺子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个数的主要内容,如果未能解决你的问题,请参考以下文章