梦执


私信TA

用户名:uq_93589957736

访问量:1312

签 名:

等  级
排  名 3444
经  验 1848
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:

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

14 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区

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;

}为什么要加这个步骤。我怎么感觉重复计算了。有没有帮我解答的大佬啊
2024-02-02 11:30:32
#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;
}
这个哪里 错了捏
2023-12-04 20:44:50
  • «
  • 1
  • »