解题思路:
原字符串:210102
一共有 8 种不同的方案:
1)所选择的子串下标为 0 ∼ 1 ,反转后的 numnew = 120102 < 210102 ;
2)所选择的子串下标为 0 ∼ 2 ,反转后的 numnew = 012102 < 210102 ;
3)所选择的子串下标为 0 ∼ 3 ,反转后的 numnew = 101202 < 210102 ;
4)所选择的子串下标为 0 ∼ 4 ,反转后的 numnew = 010122 < 210102 ;
5)所选择的子串下标为 0 ∼ 5 ,反转后的 numnew = 201012 < 210102 ;
6)所选择的子串下标为 1 ∼ 2 ,反转后的 numnew = 201102 < 210102 ;
7)所选择的子串下标为 1 ∼ 4 ,反转后的 numnew = 201012 < 210102 ;
8)所选择的子串下标为 3 ∼ 4 ,反转后的 numnew = 210012 < 210102 ;
从方案中可以看出交换方法如下
1,所选字符串下标为0-1:交换下标为0和下标为1的字符串元素,此时只交换两个元素
2,所选字符串下标为0-2:交换下标为0和下标为2的字符串元素,此时只交换两个元素,下标为1的无法进行交换
3,所选字符串下标为0-3:交换下标为0和下标为3的字符串元素,交换下标为1和下标为2的元素
4,所选字符串下标为0-4:交换下标为0和下标为4的字符串元素,交换下标为1和下标为3的元素,下标为2的不交换
依次类推:....................
解题思路:
1,使用双重循环语句,第一次循环从字符串的第一个元素开始遍历整个字符串元素,第二个循环从第二个元素开始遍历整个数组
2,根据题意:交换后的字符串要比原字符串大小更小,则为交换有效,我们可以通过比较要进行交换的两个元素的大小,确定是否交换有效
参考代码:
#include<stdio.h>
#include<stdlib.h>
#define SIZE 5000 //最长字符串长度为5000
int main(void)
{
char arr[SIZE];
int sz = 0;
int number = 0;
scanf("%s", arr);
sz = strlen(arr);
for(int i=0;i<sz-1;i++)
{
for (int j = i + 1; j < sz; j++)
{
if (arr[i] > arr[j]) //比较要进行交换的两个元素的值的大小
{
number++;
}
else if (arr[i] == arr[j])
{
int temp1 = i;
int temp2 = j;
while (temp1<temp2)//如果要交换的两个元素相等,将前一个交换元素加1,后一个交换元素减1
{
temp1++;
temp2--;
if (arr[temp1] > arr[temp2])//比较要进行交换的两个元素的值的大小
{
number++;
break;
}
else if (arr[temp1] < arr[temp2])
{
break;
}
}
}
}
}
printf("%d", number);
return 0;
}
0.0分
9 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复