当前位置: 首页 > 知识库问答 >
问题:

JAVA检查两个数字位数是否相同

祁建明
2023-03-14

嗨,我正在尝试解决Udemy练习:编写一个名为hasSharedDigit的方法,其中包含int类型的两个参数。

每个数字应在10(含)-99(含)之间。如果其中一个数字不在范围内,则该方法应返回false。

如果两个数字中都有数字,例如12和23中的2,则该方法应返回true;否则,该方法应返回false。

我一直在得到真实,而有共享数字(9,99)我无法发现为什么..

public class SharedDigit {
public static boolean hasSharedDigit(int number1, int number2){
    
    if((number1 <10 || number1 >99) && (number2 <10 || number2 >99)) {
        return false;
    } 
    
    int numberOneFirstDigit = number1/10;
    int numberTwoFirstDigit = number2/10;
    int numberOneLastDigit = number1%10;
    int numberTwoLastDigit = number2%10;
    
    if(numberOneFirstDigit == numberTwoFirstDigit || numberOneFirstDigit == numberTwoLastDigit || numberOneLastDigit == numberTwoLastDigit) {
        return true;
    } else {
    return false;
    }
}

}

共有3个答案

宣意致
2023-03-14

你在这里缺少一个比较。您拥有的是 f1 == f2 || f1 == l2 || l1 == l2,但缺少的是 l1 == f2,例如 12 和 23 会返回 false 与你的代码因为

  • 1!=2(f1==f2失败)
  • 1!=3(f1==l2失败)
  • 2!=3(l1==l2失败)
  • 您的代码缺少2==2(l1==f2),因此添加…||NumberOneLastDigit==NumberTwoFinstDigit到比较条件。

正如其他人已经说过的,您的检查也是错误的,因为它要求两个数字都超出范围,所以如果只有一个超出范围,它不会返回false。

为了方便起见,请尝试扭转条件,使两个数字都必须在范围内:

if(!(number1 >= 10 && number1 <=99 && number2 >= 10 && number2 <= 99)) {
  return false;
}

通常,如果您要“命名”条件,那么阅读和维护代码也会更容易:

boolean n1InRange = number1 >= 10 && number1 <=99;
boolean n2InRange = number2 >= 10 && number2 <=99;

if( !(n1InRange && n2InRange) { ... }
//or
if( !n1InRange || !n2InRange ) { ... }
韶和璧
2023-03-14

对方的回答和评论解决了你的直接问题。只是为了好玩,我们可以采取完全不同的方法

这里的想法是将数字视为文本。这样做,我们可以解决您的两个业务规则中的每一个:

  • 每个数字应在10(含)-99(含)的范围内。
    • 10到99之间的数字恰好有两位数。一位数或3位数表示超出范围。
    • 通过将字符串中作为第一个数字的每个字符的代码点收集到一个<code>Set</code>中,我们可以得到第二个数字的字符串的代码点的交集。如果交叉点的大小大于0,则我们知道数字是共享的

    为了解释下面的代码…codePoint方法生成一个IntStream,这是一个int数字序列,用于在Unicode中为表示输入整数的字符串中的每个字符定义的每个代码点号。装箱调用将这些int原语转换为整数对象。将这些整数对象添加到Set会自动使它们不同,自动清除任何重复的数字。

    请在IdeOne.com上查看此代码的实时运行。

    private boolean twoIntsAreInRangeAndShareDigits ( int n1 , int n2 )
    {
        String n1String = Integer.toString( n1 );
        String n2String = Integer.toString( n2 );
    
        // Check for negative numbers, meaning out-of-range, not 10-99. 
        if ( n1String.concat( n2String ).contains( "-" ) ) { return false; } 
    
        // Check for exactly 2 digits, meaning within range, 10-99.
        if ( ( n1String.length() == 2 ) && ( n2String.length() == 2 ) )
        {   // Numbers are within range. 
            // Check for common digits.
            Set < Integer > n1CodePoints = n1String.codePoints().boxed().collect( Collectors.toSet() );
            Set < Integer > n2CodePoints = n2String.codePoints().boxed().collect( Collectors.toSet() );
            n1CodePoints.retainAll( n2CodePoints );
            boolean sharesDigit = ( n1CodePoints.size() > 0 );
            return sharesDigit;
        } 
        else  // Else 1 or 3+ digits mean numbers are out-of-range.
        { return false; }
    }
    

    我并不是说这种方法更好,只是作为一种思考问题的不同方式很有趣。

伏星汉
2023-03-14

如果其中一个数字不在范围内,则该方法应返回false。

取代

if((number1 <10 || number1 >99) && (number2 <10 || number2 >99)) 

if(number1 <10 || number1 >99 || number2 <10 || number2 >99) 

除此之外,您在比较数字的条件组合中遗漏了< code > numberOneLastDigit = = numberTwoFirstDigit ,即组合应该是

if(
    numberOneFirstDigit == numberTwoFirstDigit || 
    numberOneFirstDigit == numberTwoLastDigit  || 
    numberOneLastDigit  == numberTwoFirstDigit || 
    numberOneLastDigit  == numberTwoLastDigit
)
 类似资料:
  • 问题内容: 我想检查两个数组是否相等。我的意思是:相同的大小,相同的索引,相同的值。我怎样才能做到这一点? 根据用户的建议,如果数组中的至少一个元素不同,我希望以下内容可以打印 enter ,但实际上没有。 问题答案: $arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs. $arraysA

  • 问题内容: 我想知道如何检查两个功能是否相同。一个示例将评估为true。据我所知,Python将检查函数是否在内存中占据相同的位置,而不是它们是否具有相同的操作。我知道拥有该功能似乎不切实际。 另一个解决方案是我可以在函数上运行以查看其包含的内容或工作方式的某些方法。因此,其中一种将返回该方法的工作方式,可能是在字典中还是在某种形式中。 我希望得到一个答案,但我怀疑这是可能的。 问题答案: 如果您

  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。

  • 问题内容: 如果您尝试找出int是否介于数字之间,为什么不能这样做呢? 取而代之的是,您必须做 这似乎有点开销。 问题答案: 一个问题是三元关系构造会引入严重的解析器问题: 当您尝试使用典型的PGS用这些生成物表达语法时,您会发现在first的位置存在shift-reduce冲突。解析需要先查找任意数量的符号,然后才能确定是否已使用二进制或三进制形式,以查看是否存在第二个符号。在这种情况下,您不能

  • 我有一个String类型的数组列表和一个Person类型的数组列表。其中,Person是一个仅包含包含名称的字符串的对象。 假设我这样做, 假设创建一个新的Person对象会将名称设置为“Josh”,并假设Person类具有该名称的get方法。 有没有办法检查名称数组列表中是否包含名为Josh的人。 我唯一能想到的就是这个, 现在,如果Person数组列表和names数组列表包含多个元素,如何检查

  • 问题内容: 我收到了2个轮廓(和)。我怎么知道它们是否相交?我不需要坐标,我只需要一个布尔值或。 我尝试了不同的方式,并且已经尝试与 …但是得到的错误是数组没有方法“ Area()” 问题答案: 一旦有了的两个轮廓,就可以使用按位运算来检测相交。具体来说,我们可以使用。想法是为每个轮廓创建两个单独的图像,然后对它们使用逻辑运算。具有正值(或)的任何点都将是交点。因此,由于您只想获取是否存在相交的布