Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 这种方法的目的是什么?_Algorithm - Fatal编程技术网

Algorithm 这种方法的目的是什么?

Algorithm 这种方法的目的是什么?,algorithm,Algorithm,在一次采访中,我被问到以下问题: 以下方法的目的是什么,我们如何重写它 public int question_1(int a, int b) { while (a > b) { a -= b; } return a; } 起初我认为它相当于a%b,但事实并非如此,因为它是“while(a>b)”而不是“while(a>=b)” 感谢老实说,仅仅通过阅读一个方法的实现是不可能知道它的用途的,即使我们假设它没有bug 但是,我们可以从记录其行

在一次采访中,我被问到以下问题:

以下方法的目的是什么,我们如何重写它

public int question_1(int a, int b)
{
    while (a > b)
    {
        a -= b;
    }
    return a;
}
起初我认为它相当于a%b,但事实并非如此,因为它是“while(a>b)”而不是“while(a>=b)”


感谢

老实说,仅仅通过阅读一个方法的实现是不可能知道它的用途的,即使我们假设它没有bug

但是,我们可以从记录其行为开始:

  • 如果
    b
    为正:
    • 如果
      a
      为正,则该方法返回与
      a
      b
      一致的最小正整数。(例如,给定
      15
      10
      ,它将返回
      5
      ;给定
      30
      10
      ,它将返回
      10
    • 否则,该方法返回
      a
  • 如果
    b
    为零:
    • 如果
      a
      为正,则该方法将永远循环
    • 否则,该方法返回
      a
  • 如果
    b
    为负值:
    • 如果
      a
      b
      ,该方法返回
      a
    • 否则,方法的行为取决于语言,因为它将增加
      a
      ,直到不再大于
      b
      。如果语言使用“wrapparound”规则定义整数算术,那么该方法将循环很长时间,然后最终返回一个非常负的数字(除非
      b
      本身是非常负的,在这种情况下,根据
      a
      的值,函数可能会永远循环)
考虑到这些,我们可以推断零和负数的行为非常奇怪,这种方法实际上可能只用于正数。因此,其行为可以概括为:

  • 如果
    a
    b
    均为正,则该方法返回与
    a
    b
    一致的最小正整数
如果上述推断正确,则该方法可改写为:

public int question_1(int a, int b) {
    if (a <= 0 || b <= 0)
        throw new IllegalArgumentException();
    return (a - 1) % b + 1;
}
public int question_1(int a,int b){

如果(a老实说,仅仅通过阅读方法的实现是不可能知道方法的目的的,即使我们假设它没有bug

但是,我们可以从记录其行为开始:

  • 如果
    b
    为正:
    • 如果
      a
      为正,则该方法返回与
      a
      b
      一致的最小正整数(例如,给定
      15
      10
      ,它将返回
      5
      ;给定
      30
      10
      ,它将返回
      10
    • 否则,该方法返回
      a
  • 如果
    b
    为零:
    • 如果
      a
      为正,则该方法将永远循环
    • 否则,该方法返回
      a
  • 如果
    b
    为负值:
    • 如果
      a
      b
      ,该方法返回
      a
    • 否则,方法的行为取决于语言,因为它将增加
      a
      ,直到不再大于
      b
      。如果语言使用“wrapparound”规则定义整数算术,那么方法将循环很长时间,最后返回一个非常负数(除非
      b
      本身是非常负的,在这种情况下,根据
      a
      的值,函数可能会永远循环)
考虑到这些,我们可以推断零和负数的行为非常奇怪,以至于该方法实际上可能只用于正数。因此其行为可以总结为:

  • 如果
    a
    b
    均为正,则该方法返回与
    a
    b
    一致的最小正整数
如果上述推断正确,则该方法可改写为:

public int question_1(int a, int b) {
    if (a <= 0 || b <= 0)
        throw new IllegalArgumentException();
    return (a - 1) % b + 1;
}
public int question_1(int a,int b){

如果(a,我猜它的目的是计算a%b的正整数,并且它有一个bug

如果我在生产中看到这一点,我必须检查这个函数的使用情况,看看问题_1(n,n)==n是否真的正确。如果是,我会添加一条注释,说明原因。否则我会修复它

无论是哪种情况,都可以重写为使用%运算符而不是循环。如果正确,可以这样重写:

public int question_1(int a, int b)
{
    if (a>b)
    {
        a = ((a-1)%b) + 1;
    }
    return a;
}
这在处理负数时是不一样的,所以你必须再次检查以确保这是正确的

当@ruakh已经提供了一个经过仔细考虑的答案时,我给出这个答案的原因是,这是一个面试问题,所以最好是你借此机会展示你在工作中如何处理这样的问题

你真的不想给人这样的印象,你会花很长时间和很多精力仔细思考这样一个简单的问题——如果你不得不花那么多精力去解决一个简单的问题,想象一下你会在一个大问题上花多少钱


同时,您希望证明您认识到了可能的错误,并主动修复它,或者让未来的工程师不用承担同样的任务。

我猜它的目的是计算出正整数的%b,并且它有一个错误

如果我在生产中看到这一点,我必须检查这个函数的使用情况,看看问题_1(n,n)==n是否真的正确。如果是,我会添加一条注释,说明原因。否则我会修复它

无论是哪种情况,都可以重写为使用%运算符而不是循环。如果正确,可以这样重写:

public int question_1(int a, int b)
{
    if (a>b)
    {
        a = ((a-1)%b) + 1;
    }
    return a;
}
这在处理负数时是不一样的,所以你必须再次检查以确保这是正确的

我提供这个答案的原因是什么