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
。如果语言使用“wrapparound”规则定义整数算术,那么该方法将循环很长时间,然后最终返回一个非常负的数字(除非b
本身是非常负的,在这种情况下,根据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;
}
这在处理负数时是不一样的,所以你必须再次检查以确保这是正确的
我提供这个答案的原因是什么