我试图查看int是否具有相同数字的倍数。尝试不使用字符串方法或数组。我遇到问题的主要方法是hasDistinctDigits()
。它在重复数字结束时起作用,但在它们出现在开头或中间时不起作用。
public static void main(String[] args) {
System.out.println(hasDistinctDigits(12234));
}
public static boolean hasDistinctDigits(int number) {
boolean returner = true;
int count = 1;
int newNum = number;
int digit = 0;
while (count < numDigits(number)) {
while (count < numDigits(newNum)) {
digit = newNum % 10;
newNum/=10;
if (digit == getDigit(newNum, count)) {
returner = false;
}
count++;
}
count++;
}
return returner;
}
public static int numDigits(int number) {
int count = 0;
while (number != 0) {
number /= 10;
count++;
}
return count;
}
public static int getDigit(int number, int i) {
int digit = 0;
int count = 0;
int originalNum = number;
while (count <= i) {
if (count == i) {
digit = number % 10;
}
number /= 10;
count++;
}
if (i > numDigits(originalNum)) {
return -1;
} else {
return digit;
}
}
}
如果这样,你会看到&#39; 2&#39;重复自己,但该方法仍应评估为true
何时应为false
。
答案 0 :(得分:4)
这是一个简短而甜蜜的版本:)
private static boolean hasDistinctDigits(int number) {
int numMask = 0;
int numDigits = (int) Math.ceil(Math.log10(number+1));
for (int digitIdx = 0; digitIdx < numDigits; digitIdx++) {
int curDigit = (int)(number / Math.pow(10,digitIdx)) % 10;
int digitMask = (int)Math.pow(2, curDigit);
if ((numMask & digitMask) > 0) return false;
numMask = numMask | digitMask;
}
return true;
}
它以非常简单的方式工作。 numMask
是一个整数,用于存储已遇到的数字(因为十进制系统编号只有10位数,一个整数使用16位,我们有足够的位来存储每个十进制数字)。
我们遍历数字中的所有数字。对于每个数字索引,我们得到curDigit
中的实际数字。我们说当前数字是5
。然后我们检查它在第3位被引出numMask:如果是,那么我们过去已经遇到5
,所以我们可以立即告诉该数字没有所有不同的数字并返回false;否则,我们修改numMask
并提高第5位。
如果我们到最后,那么就没有遇到重复的数字。
答案 1 :(得分:0)
您需要检查每个数字与其他数字。这表明您应该至少有两个嵌套循环。你似乎把它们混合在一起。
有一个循环用于检查数字,其他用于迭代所有其他数字。
此外,您的getDigit
方法无效。
替换为
public static int getDigit(int number, int i) {
int digit = 0;
int count = 0;
int originalNum = number;
while (count <= i) {
if (count == i) {
digit = number % 10;
}
number /= 10;
count++;
}
if (i > numDigits(originalNum)) {
return -1;
} else {
return digit;
}
}
希望这会有所帮助。 祝你好运。
答案 2 :(得分:0)
可以在此处使用相同的逻辑来验证字符串是否具有唯一字符。 (1&lt;&lt; currentChar),它将currentChar中的位设置为1等于该索引处出现的数字(0-9),并将所有其他位设置为0.
(结果&amp;(1&lt;&lt; currentChar):如果位已设置为1则返回false 其他
result = result |(1&lt;&lt; currentChar):设置结果整数中的位,该位等于该索引处的数字。
public class CheckIfDigitsAreRepeated {
public static void main(String[] args) {
int input = 1234567897; // false
// int input = 1234567890; true
System.out.println(hasDistinctDigits(input));
}
public static boolean hasDistinctDigits(int input){
int result = 0;
String inputString = String.valueOf(input);
for (int i=0; i < inputString.length();i++){
int currentChar = inputString.charAt(i)- '1';
if((result &(1 << currentChar)) > 0){
return false;
}
result = result|(1 << currentChar);
}
return true;
}
}
答案 3 :(得分:0)
public static boolean hasDistinctDigits(int number) {
int numMask = Math.floorMod(number, 10);
int numDigits = (int) Math.ceil(Math.log10(number+1));
for (int digitIdx = 0; digitIdx < numDigits; digitIdx++) {
int curDigit = (int)(number / Math.pow(10,digitIdx)) % 10;
if(numMask != curDigit) return false;
numMask = numMask & curDigit;
}
return true;
}