解题思路:

原字符串: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.0分

9 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 4 条评论

张皓博 1年前 回复TA
@帅的被人砍 少了个库函数
张皓博 1年前 回复TA
@JIAwwx 没重复啊,如果你当前选的子串最开始的数字和最后面的数字是相等的话,就要比里面长短更小的子串,就好比千位和个位相等了,你就要缩短长度比较里面的百位和十位
JIAwwx 1年前 回复TA
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;

}为什么要加这个步骤。我怎么感觉重复计算了。有没有帮我解答的大佬啊
帅的被人砍 1年前 回复TA
#include<stdio.h>
#include<string.h>
int main(){
	char a[5000]="";
	gets(a);
	int i=0,j,k=strlen(a),n=0,m;
	for(i=0;i<k;i++){
		for(j=i+1;j<k;j++){
			char b[j-i+1],c[j-i+1];
			for(m=0;m<j-i+1;m++){
				b[m]=a[i+m];
				c[m]=a[j-m];
			}
			if(strcmp(c,b)<0)
			n++;
			for(m=0;m<j-i+1;m++){
				b[m]='0';
				c[m]='0';
			}
		}
	}
	printf("%d",n);
	return 0;
}
这个哪里 错了捏