这本来是我在工作中遇到的一个问题,但现在我正试图解决我自己的好奇心.
我想知道int'a'是否以最有效的方式包含int'b'.我编写了一些代码,但似乎无论我编写什么,将其解析为字符串然后使用indexOf的速度是数学上的两倍.
记忆不是问题(在合理范围内),只是纯粹的处理速度.
这是我用数学方式编写的代码:
private static int[] exponents = {10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 }; private static boolean findMatch(int a, int b) { if (b > a) return false; if (a == b) return true; int needleLength = getLength(b); int exponent = exponents[needleLength]; int subNum; while (a >= 1) { subNum = a % exponent; if (subNum == b) return true; a /= 10; } return false; } private static int getLength(int b) { int len = 0; while (b >= 1) { len++; b /= 10; } return len; }
这是我正在使用的字符串方法,它似乎胜过上面的数学方法:
private static boolean findStringMatch(int a, int b) { return String.valueOf(a).indexOf(String.valueOf(b)) != -1; }
因此,尽管我并不是真的需要完成我的工作,但我只是想知道是否有人能想出任何方式来进一步优化我的数学方法,或者完全是一种全新的方法.再一次记忆没问题,我只是为了速度而拍摄.
我真的很想看到或听到任何人提供的任何东西.
编辑: 当我说包含我的意思是可以在任何地方,所以例如,findMatch(1234,23)== true
编辑:对于每个人说这个废话是不可读和不必要的:你错过了这一点.关键是要找出一个有趣的问题,不要想出在生产代码中使用的答案.
它应该是更快的字符串方式,因为你的问题是文本的,而不是数学的.请注意,您的"包含"关系没有说明数字,它只是说明了它们的十进制表示.
另请注意,您要编写的函数将无法读取 - 另一位开发人员永远不会理解您正在执行的操作.(看看你在这里遇到了什么麻烦.)另一方面,字符串版本非常清楚.