Check if a Number Has Digits in the Given Order or Not in Java

2025年5月10日 | 阅读 5 分钟

问题陈述

给定一个数字 n。任务是检查该数字的各位数字是否遵循给定的顺序(严格递增、递减或其他模式)。

示例 1

输入 1234

输出: YES

解释: 数字是严格递增的,所以数字遵循所需的模式。

示例 2

输入 4321

输出: YES

解释: 数字是严格递减的,这是一个有效的模式。

示例 3

输入 1324

输出: NO

解释: 数字不遵循严格递增或递减的顺序,因此无效。

示例 4

输入 321

输出: YES

解释: 数字是严格递减的,这满足了条件。

示例 5

输入 123454321

输出: YES

解释: 数字先增加(1 → 5),然后减少(5 → 1),形成了一个有效的山形模式。

迭代数字提取法

该方法检查给定数字的各位数字是否遵循严格递增顺序、严格递减顺序或山形模式(先递增,再递减)。

算法

步骤 1: 如果数字只有一个数字,则返回“NO”。

步骤 2: 从最右边一位一位地提取数字。

步骤 3: 跟踪数字是严格递增、严格递减还是遵循峰值(山形模式)。

步骤 4: 如果数字先增加后减少,则为有效的山形模式。

步骤 5: 如果任何数字等于前一个数字,则返回“NO”(需要严格顺序)。

步骤 6: 如果数字在增加后开始减少,但后来又增加,则返回“NO”。

步骤 7: 如果这三个条件中的任何一个成立,则返回“YES”;否则,返回“NO”。

输出

 
YES   

时间复杂度:程序的 o(d) 时间复杂度,其中 d 是数字中的位数,因为我们只迭代一次所有数字。

空间复杂度:程序的 o(1) 空间复杂度,因为只使用少数几个整数变量来跟踪状态。

字符串转换法

该方法将给定的数字转换为字符串,并遍历其各位数字,以确定它们是否遵循严格递增、严格递减或山形模式。

算法

步骤 1: 将数字转换为字符串。

步骤 2: 初始化三个布尔标志。

步骤 3: 遍历各位数字

  1. 如果任何两个连续的数字相同,则返回“NO”(需要严格顺序)。
  2. 如果某个数字小于前一个数字,则将 decreasing 标记为 false,并将 peakReached 标记为 true。
  3. 如果在达到峰值后,某个数字大于前一个数字,则返回“NO”。

步骤 4: 如果数字遵循严格递增、严格递减或山形模式,则返回“YES”。否则,返回“NO”。

输出

 
YES   

时间复杂度:程序的 o(d) 时间复杂度,其中 d 是数字中的位数。因为程序只遍历数字的各位一次。

空间复杂度:程序的 o(d) 空间复杂度。因为只使用了少数几个整数变量

递归方法

该方法使用递归来检查给定数字的各位数字是否为严格递增、递减或山形顺序(先递增,然后递减)。该函数在跟踪序列是递增、递减还是达到峰值的同时,递归地从右到左处理每个数字。

算法

步骤 1: 如果数字只剩下一位,则如果它遵循有效的模式之一,则返回“YES”。

步骤 2: 将最后一个数字 (prevDigit) 与倒数第二个数字 (currentDigit) 进行比较。

步骤 3: 检查条件

  1. 如果数字相等,则返回“NO”。
  2. 如果开始递减,则标记为 peakReached = true。
  3. 如果在达到峰值后出现递增,则返回“NO”。

步骤 4: 使用更新后的值处理剩余的数字(num / 10)

输出

 
YES   

时间复杂度:程序的 o(d) 时间复杂度,其中 d 是数字中的位数,因为我们一次处理一个数字。

空间复杂度:程序的 o(d) 空间复杂度,因为递归函数调用存储在调用堆栈中。


下一主题Lombok Java