下一个回文数2025年2月6日 | 阅读7分钟 在此问题中,我们将提供一个字符串。我们需要找到给定字符串的下一个回文数。 让我们举个例子来理解它 如果给定的字符串是 11 11 之后的下一个回文数是 22。 另一个例子 如果给定的字符串是 121,下一个可能的字符串是 131。 这就是我们需要在这个代码中实现的。 让我们来实现这段代码 代码 输出 ![]() 说明 要实现这一点,将处理两种情况:一种是字符串长度为偶数的情况,另一种是字符串长度为奇数的情况。 让我们详细讨论当字符串长度为奇数时会发生什么 例如:12121, 首先,我们将字符串分为三部分:前半部分、中间部分和后半部分,它们是 12、1 和 21, 这里,当我们遇到中间部分时,我们只需要将中间部分的值加 1;如果我们加 1,中间部分就变成 2。 现在,前半部分是 12;中间是 2。 现在,要获得最后一部分,我们需要反转前半部分,前半部分的反转是 21。 现在我们需要将这三个字符串组合起来:前半部分、中间部分和后半部分。 组合后,我们得到 12、3 和 21,即 12321。 现在,结果是,即下一个回文数是 12221。 这里我们遇到一个中间部分为 9 的情况;如果中间部分是 9,如果我们加 1,它就变成 10,这时我们需要将进位加到前面的数字;让我们举个例子来理解这一点。 如果字符串是 12900。 这里,如果我们把前半部分分成 12,中间部分是 9,后半部分是 00。 我们需要将中间部分加 1,即 9,它变成 10。 在这种情况下,我们需要将数字 1 加到整个部分(前半部分 + 中间部分)。 整个部分是 129;如果我们加 1,它变成 130。 加完之后,我们需要连接前半部分的倒数。 前半部分是 13;如果我们反转它,它变成 31,组合起来就是 13031。 这就是我们将如何处理奇数长度的情况。 现在,让我们讨论如何处理字符串长度为偶数的情况。 我们也在这里举个例子:如果字符串是 123456, 这与之前的过程也类似, 由于这里是偶数长度,我们不会遇到中间部分,因为它平均分成两部分。 如果我们将其分成两部分,它变成 123 和 456。 我们需要反转前半部分,反转后是 321。 现在,我们需要将前半部分与其反转组合起来;然后它变成 123321。 这里,123321 小于 123456,但我们必须找到下一个更大的回文数。 如果出现任何前半部分 + 前半部分反转小于给定数字的情况,我们直接返回给定数字。 如果不是,我们需要在前半部分加 1;在上面的例子中,如果我们给 123 加 1,它变成 124;现在,我们需要反转这个字符串并将其添加到新字符串中,即 124。 124 的反转是 421,如果我们组合起来,就变成 124421。 所以,这里的下一个回文字符串是 124421。 现在让我们看看代码的详细解释 奇数回文函数 定义一个函数来处理奇数长度的回文数。它接受一个字符串和一个长整型作为参数。 转换为整数 将输入字符串转换为长整型。 此整数稍后用于比较。 字符串子串 将输入字符串分为三部分 前半部分 (fs),中间字符 (ms),和后半部分 (ls)。 回文数构建 通过连接前半部分 (fs)、中间字符 (ms) 和前半部分的反转 (r) 来构建一个回文数。 回文数转换:将构建的回文数转换回整数,以便与原始输入进行比较。 比较和输出:将构建的回文数与原始整数进行比较。 如果回文数小于或等于原始整数,它会进行调整并打印下一个回文数。 否则,它直接打印构建的回文数。 偶数回文函数 定义一个函数来处理偶数长度的回文数。 转换为整数:将输入字符串转换为长整型以便比较。 字符串子串 将输入字符串分为前半部分 (fs) 和后半部分 (ls)。 回文数构建 通过连接前半部分 (fs) 和前半部分的反转来构建一个偶数长度的回文数。 比较和输出 将构建的回文数与原始整数进行比较。 如果回文数小于或等于原始整数,它会进行调整并打印下一个回文数。 否则,它直接打印构建的回文数。 主函数 从用户那里读取测试用例的数量 (t)。 对于每个测试用例 读取一个整数 (n)。 将整数转换为字符串以确定其长度。 根据长度调用相应的函数(奇数或偶数)来查找并打印下一个回文数。 边缘情况处理 检查输入是否小于或等于 10,并相应地打印下一个回文数。 输入和输出 使用标准输入 (cin) 读取值,并使用标准输出 (cout) 显示结果。 运行一个循环来处理多个测试用例。 让我们讨论代码的时间和空间复杂度 时间复杂度 奇数回文函数 构建回文数涉及反转字符串,这需要 O(l/2) 的时间,其中 'l' 是输入字符串的长度。 字符串到整数的转换和整数算术运算需要常量时间。 总的来说,时间复杂度为 O(l/2)。 偶数回文函数 构建回文数涉及反转字符串,这需要 O(l/2) 的时间,其中 'l' 是输入字符串的长度。 字符串到整数的转换和整数算术运算需要常量时间。 总的来说,时间复杂度为 O(l/2)。 主函数 主函数独立处理每个测试用例。 对于每个测试用例,时间复杂度取决于输入字符串的长度是奇数还是偶数。 在每种情况下,时间复杂度都是 O(l/2)。 总而言之 总时间复杂度为 O(t * l/2),其中 't' 是测试用例的数量,'l' 是输入字符串的平均长度。 空间复杂度 奇数回文函数 为 firval、fs、ms、ls、r 和 pal 等变量使用恒定的额外空间。 没有额外空间与输入大小成比例使用。总的来说,空间复杂度为 O(1)。 偶数回文函数 为 firval、fs、ls 和 pal 等变量使用恒定的额外空间。没有额外空间与输入大小成比例使用。 总的来说,空间复杂度为 O(1)。 主函数 为 t、n、s、len 以及每个测试用例中的临时变量使用恒定的额外空间。 没有额外空间与输入大小成比例使用。 总的来说,空间复杂度为 O(1)。 总结 由于使用了恒定的额外空间,该代码的空间复杂度很低,为 O(1)。 时间复杂度为 O(t * l/2),其中 't' 是测试用例的数量,'l' 是输入字符串的平均长度。 下一个主题验证 IPv4 地址的程序 |
我们请求您订阅我们的新闻通讯以获取最新更新。