剑指offer——Day16 排序(简单)

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容器的一些操作
posted @ 2022-11-26 22:17  神鹏佐佑  阅读(21)  评论(0)    收藏  举报