Java中处理数字和字符串的奇偶位数统计需求时,需要根据数据类型选择对应的实现逻辑,不同类型的输入有不同的高效处理方案。

数字类型的奇偶位数统计
对于整数类型的数字,奇偶位数指的是数字从右往左数,第1位、第3位等奇数位置,以及第2位、第4位等偶数位置的位数统计。高效的处理方式是通过取模运算逐位拆分数字,同时记录当前位数位置。
实现思路
- 初始化奇数位计数器和偶数位计数器,初始值都为0
- 用位置变量记录当前处理的是第几位,从1开始计数
- 循环取数字的最后一位,判断当前位置是奇数还是偶数,对应计数器加1
- 将数字除以10去掉最后一位,位置变量加1,直到数字变为0
代码示例
public class NumberOddEvenDigitCounter {
public static int[] countNumberOddEvenDigits(int num) {
// 处理负数的情况,取绝对值
int target = Math.abs(num);
int oddCount = 0;
int evenCount = 0;
int position = 1;
// 循环拆分每一位数字
while (target > 0) {
int currentDigit = target % 10;
if (position % 2 == 1) {
oddCount++;
} else {
evenCount++;
}
target = target / 10;
position++;
}
return new int[]{oddCount, evenCount};
}
public static void main(String[] args) {
int testNum = 123456;
int[] result = countNumberOddEvenDigits(testNum);
System.out.println("数字" + testNum + "的奇数位数:" + result[0]);
System.out.println("数字" + testNum + "的偶数位数:" + result[1]);
}
}
上述代码的时间复杂度为O(k),k是数字的位数,空间复杂度为O(1),是最优的实现方式。
字符串类型的奇偶位数统计
字符串的奇偶位数通常指字符串索引的奇偶位置,Java中字符串索引从0开始,因此奇数索引对应第2位、第4位等,偶数索引对应第1位、第3位等,需要根据需求调整判断逻辑。
实现思路
- 获取字符串的长度,初始化两个计数器
- 遍历字符串的每个字符,通过索引判断当前位置是奇数还是偶数
- 对应计数器加1,遍历完成后返回结果
代码示例
public class StringOddEvenCharCounter {
public static int[] countStringOddEvenPositions(String str) {
if (str == null || str.isEmpty()) {
return new int[]{0, 0};
}
int oddIndexCount = 0;
int evenIndexCount = 0;
// 字符串索引从0开始,0是偶数索引,1是奇数索引
for (int i = 0; i < str.length(); i++) {
if (i % 2 == 0) {
evenIndexCount++;
} else {
oddIndexCount++;
}
}
return new int[]{oddIndexCount, evenIndexCount};
}
public static void main(String[] args) {
String testStr = "abcdef";
int[] result = countStringOddEvenPositions(testStr);
System.out.println("字符串" + testStr + "的奇数索引位置字符数:" + result[0]);
System.out.println("字符串" + testStr + "的偶数索引位置字符数:" + result[1]);
}
}
如果需要按照日常习惯从1开始计数位置,只需要将判断条件改为(i+1)%2==1即可,代码改动很小。
两种场景的效率对比
下面通过表格对比两种统计方式的特性:
| 统计场景 | 时间复杂度 | 空间复杂度 | 适用输入类型 |
|---|---|---|---|
| 数字奇偶位数统计 | O(k),k为数字位数 | O(1) | int、long等整数类型 |
| 字符串奇偶位数统计 | O(n),n为字符串长度 | O(1) | String类型 |
两种实现都是线性时间复杂度,已经是最高效的实现方式,不需要额外的复杂操作。
注意事项
- 数字统计时需要处理负数的情况,直接取绝对值即可,不影响位数统计结果
- 字符串统计时如果输入为null或者空字符串,需要提前做判空处理,避免空指针异常
- 索引计数的起始值需要和实际需求对齐,避免位置判断错误
实际开发中可以根据具体的业务需求调整计数逻辑,比如只统计数字字符的奇偶位数,只需要在遍历时增加字符类型的判断即可。