通过交换相邻数字(差值为奇数)来最小化给定数字
本文旨在实现一个程序,通过交换相邻数字(差值为奇数)来最小化给定数字。
目标是确定仅使用字符“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 语言代码以及实现程序的算法和方法,该程序通过交换相邻数字(差值为奇数)来最小化给定数字。