如何在不转换为字符串的情况下替换Int32中的第n位数字?
替换Int32指定位置数字的无字符串转换方案
问题场景
给定以下代码:
var digitToSubstitute = 5; var targetNumber = 999999999; var expectedOutput = 995999999;
要求在不转换为字符串的前提下替换数字的指定位(示例中是将百万位的9替换为5,得到目标结果),且该操作要用于紧凑循环,需避免字符串操作带来的性能损耗。
实现思路
核心通过纯数学运算完成,步骤如下:
- 确定目标位的位权:若从右数第k位,位权为
10^(k-1);若从左数位置,先计算数字总位数,再转换为从右数的位置。 - 分离高位部分:用目标数除以
位权*10后再乘以位权*10,保留目标位左侧的所有数字。 - 分离低位部分:用目标数对
位权取余,保留目标位右侧的所有数字。 - 拼接结果:高位部分 + 新数字*位权 + 低位部分。
代码实现
针对从右数的指定位置
以示例中替换从右数第7位(百万位)为例:
int digitToSubstitute = 5; int targetNumber = 999999999; int positionFromRight = 7; int placeValue = (int)Math.Pow(10, positionFromRight - 1); // 提取目标位左侧的高位数字 int leftPart = targetNumber / (placeValue * 10) * (placeValue * 10); // 提取目标位右侧的低位数字 int rightPart = targetNumber % placeValue; // 拼接得到结果 int result = leftPart + digitToSubstitute * placeValue + rightPart; // result = 995999999,符合预期
支持从左数的指定位置
先通过辅助方法计算数字总位数,再转换为从右数的位置:
// 计算整数的总位数 int GetDigitCount(int num) { if (num == 0) return 1; int count = 0; while (num != 0) { count++; num /= 10; } return count; } // 示例:替换从左数第3位 int positionFromLeft = 3; int digitCount = GetDigitCount(targetNumber); int positionFromRight = digitCount - positionFromLeft + 1; // 后续位权计算、拼接步骤与上述一致
性能说明
这种纯数学运算的方式无内存分配,完全规避了字符串操作的开销,在紧凑循环中能保持高效的执行效率,适合生成数字组合并校验的场景。
内容的提问来源于stack exchange,提问作者Nick Farsi
相关产品推荐
相关产品推荐

