通过交换相邻数字(差值为奇数)来最小化给定数字
本文旨在实现一个程序,通过交换相邻数字(差值为奇数)来最小化给定数字。
目标是确定仅使用字符“1”、“2”和“3”通过任意次数交换相邻字符,从表示整数的长度为 N 的字符串中可以创建的最小值。
众所周知,在 C 语言编程中,字符串是一组以空字符“\0”结尾的字符。C 字符串中的字符存储在一个字符数组中。C 字符串与字符数组的区别在于它以特殊的字符“\0”结尾。
示例 1
Let the Input string be, S = “211323” Output obtained here is: 112233
示例 2
Let the Input string be, S = “112323” Output obtained here is: 112233
示例 3
Let the Input string be, S = “231213” Output obtained here is: 223113
示例 4
Let the Input string be, S = “123123” Output obtained here is: 122313
问题陈述
实现一个程序,通过交换相邻数字(差值为奇数)来最小化给定数字
方法
解决这个问题并获得一个程序来最小化给定数字的方法,该程序通过交换相邻数字(差值为奇数)来实现。
通过以下见解,可以使用贪心算法来解决这个问题:
贪心算法究竟是什么?
贪心算法逐段构建解决方案,始终选择提供最明显和直接好处的组件作为下一步。因此,贪心算法非常适合于选择局部最优解也能导致全局最优解的问题。
在这种情况下,由于 1 和 3 之间的差是 2(偶数),因此它们不能交换。
由于 1 和 2 之间的差是 1(奇数),因此 2 和 3 之间的差也是如此。
由于 1 和 2 之间的差是 1(奇数),因此 2 和 3 之间的差也是如此。
算法
下面给出了实现程序的算法,该程序通过交换相邻数字(差值为奇数)来最小化给定数字
步骤 1 - 定义一个函数来交换相邻数字(如果差值为奇数),以获得与给定字符串匹配的最小数字。
步骤 2 - 查找给定字符串的长度
步骤 3 - 声明一个整型变量来存储 3 的第一次出现位置
步骤 4 - 声明变量来跟踪字符串中 2 的总数和第一个 3 之前的 1 的计数
步骤 5 - 现在,遍历字符串时,计算第一个 3 之前的 1 的数量和 2 的总数。
步骤 6 - 将第一个 3 出现之前的所有 1 都添加到结果中
步骤 7 - 将每个 2 都添加到结果中
步骤 8 - 将剩余的 3 和 1 以与给定字符串相同的顺序添加到结果中
步骤 9 - 最后,打印输出结果。
示例:C 程序
以下是上述算法的 C 语言程序实现,该程序通过交换相邻数字(差值为奇数)来最小化给定数字
#include <stdio.h>
#include <string.h>
void findMinimumString(char S[]){
int N = strlen(S);
int pos = -1;
int count1 = 0, count2 = 0;
for (int i = 0; i < N; i++) {
if (pos == -1 && S[i] == '1')
count1++;
else if (pos == -1 && S[i] == '3')
pos = i;
else if (S[i] == '2')
count2++;
}
while (count1--)
printf("1");
while (count2--)
printf("2");
if (pos != -1) {
while (pos < N) {
if (S[pos] != '2')
printf("%c", S[pos]);
pos++;
}
}
}
int main(){
char S[] = "211323";
findMinimumString(S);
return 0;
}
输出
112233
结论
同样,我们可以得到一个程序,通过交换相邻数字(差值为奇数)来最小化给定数字。“通过交换相邻数字(差值为奇数)来最小化给定数字”这一挑战已在本文中得到解决。
本文提供了 C 语言代码以及实现程序的算法和方法,该程序通过交换相邻数字(差值为奇数)来最小化给定数字。
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP