第一题


先排序,后双指针,如相等就插入,双指针++,不相等就小的++
第二题

void swap(char*a,char*b)
{
char temp=*a;
*a=*b;
*b=temp;
}
int cmp(const void*a, const void*b)
{
return *((char*)b)-*((char*)a);//从大到小
}
int maximumSwap(int num){
int m;
if(num==0)
{
return 0;
}
char str0[16]={0};
char str[16]={0};
sprintf(str0,"%d",num);
sprintf(str,"%d",num);//字符串强转
int len=(int)strlen(str);
qsort(str,len,sizeof(char),cmp);//str为标准答案
for(int i=0;i<len;i++)
{
if(str[i]!=str0[i])
{
for(int j=0;j<len;j++)
{
if(str[i]==str0[j])
{
m=j;
break;
}
}//swapstr0[i]和[j]
swap(&(str0[i]),&(str0[m]));
break;
}
}
return atoi(str0);
}
思路:先将数字强转成字符串sprintf(str0,"%d",num)
用cmp将str降序排序为最佳标准答案,从头开始遍历,看目前字符串str0与str哪一位不相等,就在原先的字符串中从后往前遍历查找这一位,并在原先字符串中将其交换,随后将字符串转成int撒呼出atoi(str0)
知识点:
1.字符串强转
sprintf(str,"%d",num)
2.对象为char的cmp排序
int cmp(const void*a,const void*b)
{
return *((char*)a)-*(char*)b;
}
3.对象为char的swap
void swap(char *a,char *b)
{
char temp=*a;
*a=*b;
*b=temp;
}
4.字符串转成数字
atoi(str)
第三题


暴力枚举左右边界,记录最大值最小值,并+=sum
2万+

被折叠的 条评论
为什么被折叠?



