Day16 2022.11.22 排序(简单)

45.把数组排成最小的数

自己实现

没有思路

题解

也是比较大小,只是这个比较大小的方法是两个数字字符串string xstring y,如果x+y<y+x,说明x应该在前面,这里暂且定义为x<y。然后正常比较大小,采用适当的排序方法即可

代码如下:

class Solution {
public:
	string minNumber(vector<int>& nums) {
		int min = 99999;
		int i, j;
		int pos;
		for (i = 0; i < nums.size() - 1; i++)
		{
			min = nums[i];
			pos = i;
			for (j = i + 1; j < nums.size(); j++)
			{
				if (to_string(min) + to_string(nums[j]) > to_string(nums[j]) + to_string(min))
				{
					min = nums[j];
					pos = j;
				}
			}
			int tmp = nums[i];
			nums[i] = nums[pos];
			nums[pos] = tmp;
		}
		string res = "";
		for (i = 0; i < nums.size(); i++)res += to_string(nums[i]);
		return res;
	}
};

代码表现

因为采用的是最简单的选择排序,所以时间很久

hint:

  • int和string的互相转化
    • int转成string: string str=to_string(i);
    • string转成int: int a=atoi(str.c_str())

61.扑克牌中的顺子

自己实现

一开始想的是直接排序,因为大小王是0所以会被直接放到数组最开始,然后再判断后面的相邻两个元素之间的差值是否能满足。但是感觉这个方法很难实现并且很慢,所以直接看题解了。

题解

满足两个条件即符合顺子:

  • 除了大小王(0)之外没有重复的牌
  • ***最大值-最小值<5

代码如下:

class Solution {
public:
    bool isStraight(vector<int>& nums) {
        set<int> repeat;
        if(nums.size()!=5)return false;
        int i;
        int max=-1;
        int min=20;
        for(i=0;i<nums.size();i++)
        {
            if(nums[i]!=0 && repeat.count(nums[i])==1)return false;
            repeat.insert(nums[i]);
            if(nums[i]!=0)
            {
                if(nums[i]>max)max=nums[i];
                if(nums[i]<min)min=nums[i];   
            }
        }
        if(max-min<5)return true;
        return false;
    }
};

代码表现

hint:

  • 处理几个值是否连续且这几个值不重复的判断时,可以采用最大值-最小值来进行判断,即将值框定在某个范围内即可,这样的判断很牛
  • set容器的一些操作

原文地址:http://www.cnblogs.com/cspzyy/p/16928499.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性