本人新手基本上就是官方解法只是加了注释
题目要求:
如果字符串中不含有任何 '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即可
*/