力扣刷题笔记25——扑克牌中的顺子/排序函数sort

问题

来自力扣

从若干副扑克牌中随机抽 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
 

限制:
数组长度为 5 
数组的数取值为 [0, 13] .

我的代码

#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include<queue>
#include <typeinfo>
#include <numeric>
#include<cmath>
#include<map>
#include<string>
#include<stack>
#include<utility>

class Solution {
public:
	bool isStraight(vector<int>& nums) {
		sort(nums.begin(), nums.end());
		int numszero = 0;
		for (int i = 0; i < 4; ++i) {
			if (nums[i] == 0) {
				numszero++;
			}
			else {
				if (nums[i] == nums[i + 1])
					return false;
			}
		}

		if (nums[4] - nums[numszero] > 4) 
			return false;
		return true;
	}
};

int main() {
	Solution mysolution;
	vector<int> nums = { 0,0,1,2,6 };
	bool knum = mysolution.isStraight(nums);
	cout << knum;
	return 0;
}

思路:要判断五个数字是否是顺子,只需要确保两点,1:最大的数字与最小的数字差值小于4。2:没有重复的数字。
做法1先从大到小排序,2遍历vector,0则记下来;不是0则看看他和下一个数字是否相同,如果相同则肯定不是顺子,直接返回false。3判断非零的数中最大值-最小值是否大于4,大于4肯定也是顺子,直接返回false。4返回true。

示例代码

class Solution {
public:
    bool isStraight(vector<int>& nums) {
        int hash[14]={0};
        int king=0,max_num=0,min_num=14;
        for(int num:nums){
            if(num==0)
                king++;
            else{
                if(hash[num]>=1)
                    return false;
                hash[num]++;
                max_num=max(max_num,num);
                min_num=min(min_num,num);
            }
        }
        if(max_num-min_num<=4)
            return true;
        
        return false;
    }
};

思路是一样的,我就不解释了。
做法的话,它用了用了个表来记录是否有重复的。这个的优点是不需要像我一样去sort,但坏处是占用过多空间。

sort()

上次做了道题(题没啥难的,就没做笔记),我看到里面用了这个函数,而且还自己定义了一个compare函数,所以这次既然用了就顺便记录一下笔记。
功能:排序,默认从小到大排序。
参数:起始位置,结束位置,排序的方法[没有的话就默认是从小到大排序]
需引入的头文件#include <algorithm>

从小到大排序

int main() {
	vector<int> nums = { 10,0,1,7,6 };
	sort(nums.begin(), nums.end());
	for (auto num : nums) {
		cout << num << "\t";
	}
	return 0;
}

在这里插入图片描述

从大到小排序1-不用第三个参数

int main() {
	vector<int> nums = { 10,0,1,7,6 };
	sort(nums.rbegin(), nums.rend());
	for (auto num : nums) {
		cout << num << "\t";
	}
	return 0;
}

在这里插入图片描述

vector.rbegin(),vector.begin(),vector.rend(),vector.end()这四个的差异如下图

在这里插入图片描述

从大到小排序2-用第三个参数

bool compare(int a, int b) {
	return a > b;
}
int main() {
	vector<int> nums = { 10,0,1,7,6 };
	sort(nums.begin(), nums.end(),compare);
	for (auto num : nums) {
		cout << num << "\t";
	}
	return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小欣CZX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值