如何通过递归查找两个整数的最后一个公共数字的反向索引
搞定两个整数公共数字的最高反向索引问题
嘿,我明白你要做的事了——从右往左数(反向索引),找到两个整数里最靠左(也就是反向索引最大)的那个公共数字的位置,就像你给的例子:a=2224,b=4222,结果是2对吧?正好我可以给你捋清楚怎么实现。
思路拆解
要找最高反向索引,其实核心是先找到两个数最左侧的公共数字,再把它转换成反向索引就行。步骤大概是这样:
- 把数字转成字符串,方便我们从左到右遍历(毕竟最左边的数字对应最大的反向索引)
- 对齐两个数的长度,短的那个前面补0,比如一个是3位一个是4位,补0后长度一致,这样每一位都能对应上
- 从左到右扫每一位,碰到第一个相同的数字,就计算它的反向索引:
总长度 - 1 - 当前正向索引(因为反向索引从右数,个位是0) - 如果压根没公共数字,就返回-1或者抛异常,看你需求来
代码实现(和你的现有方法风格一致)
这里直接给你写好方法,和你已经有的getLowestIndexWithSameDigit逻辑呼应:
private static int getHighestIndexWithSameDigit(int a, int b) { // 先处理负数,和你原来的方法保持一致 if (a < 0 || b < 0) { throw new IllegalArgumentException("Ambos os argumentos devem ser positivos"); } // 转成字符串方便处理每一位 String strA = String.valueOf(a); String strB = String.valueOf(b); // 对齐长度,短的前面补0 int maxLength = Math.max(strA.length(), strB.length()); strA = String.format("%" + maxLength + "s", strA).replace(' ', '0'); strB = String.format("%" + maxLength + "s", strB).replace(' ', '0'); // 从左到右找第一个相同的数字 for (int i = 0; i < maxLength; i++) { if (strA.charAt(i) == strB.charAt(i)) { // 计算反向索引:总长度-1减去正向索引,因为反向从个位开始数0 return maxLength - 1 - i; } } // 没找到公共数字的情况,返回-1 return -1; }
测试你的示例
拿你给的a=2224,b=4222来试:
- 转成字符串后是"2224"和"4222",长度都是4
- 从左到右扫,i=1的时候,两个字符都是'2'
- 反向索引就是
4-1-1=2,正好和你的示例结果一致!
和你现有方法的区别
你现有的getLowestIndexWithSameDigit是找最右边的公共数字(反向索引最小),这个方法是找最左边的(反向索引最大),逻辑上刚好反过来:一个从右往左找,一个对齐后从左往右找。
额外小提示
如果两个数字长度不一样,比如a=224,b=4222,补0后a变成"0224",和b的"4222"对齐,第一个相同的是i=1的'2',反向索引是3,对应a的百位和b的百位,完全正确。
内容的提问来源于stack exchange,提问作者Fred Costa
相关产品推荐
相关产品推荐

