leetcode最长快乐字符

本人新手基本上就是官方解法只是加了注释

题目要求:

如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。

给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:

s 是一个尽可能长的快乐字符串。
s 中 最多 有a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。
s 中只含有 'a'、'b' 、'c' 三种字母。
如果不存在这样的字符串 s ,请返回一个空字符串 ""。

示例 1:

输入:a = 1, b = 1, c = 7
输出:"ccaccbcc"
解释:"ccbccacc" 也是一种正确答案。
示例 2:

输入:a = 2, b = 2, c = 1
输出:"aabbc"
示例 3:

输入:a = 7, b = 1, c = 0
输出:"aabaa"
解释:这是该测试用例的唯一正确答案。

解题思路
qsort排序完成后进入for循环。如果已经有字母出现两次用continue进入i++;如果其他情况则执行完之后用break直接结束for循环。再进入if (hasNext==false) {
break;的判断过程,判断标识符是否为假,

typedef struct {
    int freq;
    char ch;
} Pair;//定义一个结构体

int cmp(const void * pa, const void * pb) {
    return ((Pair *)pb)->freq - ((Pair *)pa)->freq;
}//使用qsort所需的比较函数,升序用pa-pb,降序用pb-pa

char * longestDiverseString(int a, int b, int c){
    char * res = (char *)malloc(sizeof(char) * (a + b + c + 1));//开创一个空间给res数组使用,存放字符串
    Pair arr[3] = {{a, 'a'}, {b, 'b'}, {c, 'c'}};
    int pos = 0;

    while (true) {//whie(true)需要下面的执行内容有break或者continue才能退出
        qsort(arr, 3, sizeof(Pair), cmp);//排序,按照降序拍
        bool hasNext = false;//先定义标识符为0
        for (int i = 0; i < 3; i++) {//有abc三种字母就循环三次
            int freq = arr[i].freq;//第一个循环取出最大的freq的值
            int ch = arr[i].ch;//取出所对应字母
            if (freq <= 0) {
                break;//如果最大值都是0那就直接退出
            }
            if (pos >= 2 && res[pos - 2] == ch && res[pos - 1] == ch) {
                continue;//如果该字母对应出现次数超过两次久跳出这次i对应的循环进入i++的循环再次判断
            }
            hasNext = true;//若上述均无跳出循环则满足继续条件设置hasnext为真
            res[pos++] = ch;//给相应的位置赋值
            arr[i].freq--;//剩余freq少1
            break;
        }
       if (hasNext==false) {
            break;//如果标识符一直为假就推出while(true)
        }
    }
    res[pos] = '\0';//给最后一位赋值结束符
    return res;//输出res
}

若为假结束while(true)。

/*qsort功能: 使用快速排序例程进行排序
  头文件:stdlib.h
  用法:  void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*)); 
  参数: 1 待排序数组,排序之后的结果仍放在这个数组中
      2 数组中待排序元素数量
       3 各元素的占用空间大小(单位为字节)
         4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)
例子
int num[100];
int cmp_int(const void* _a , const void* _b)  //参数格式固定
{
    int* a = (int*)_a;    //强制类型转换
    int* b = (int*)_b;
    return *a - *b;  
}
qsort(num,100,sizeof(num[0]),cmp_int); 
可见,参数列表是两个空指针,现在他要去指向你的数组元素。所以转换为你当前的类型,然后取值。默认升序排列(从小到大),如果想降序排列返回*b-*a即可
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值