Codility - 功能改变

Codility - function alteration

提问人:WindSwept 提问时间:8/16/2014 最后编辑:Martijn PietersWindSwept 更新时间:10/25/2022 访问量:14261

问:

我遇到了这个 codility 测试,问题是发现函数中的错误并对其进行调整,使其正常工作。

传递给函数的数组是 {1,3,3} 和 K =2。如果在数组中找不到 K,该函数应该返回 false,但它返回 true。您只能更改 2 行代码。

public static bool solution(int[] A, int K)
    {

        int n = A.Length;
        for (int i = 0; i < A.Length - 1; i++)
        {
            if (A[i] + 1 < A[i + 1])
                return false;
        }
        if (A[0] == 1 && A[n - 1] != K)
            return false;
        else
            return true;

    } 

在正常情况下,我会重写函数,因为我知道它应该做什么:

public static bool solution(int[] A, int K)
    {
        int n = A.Length;
        int count = 0;
        for (int i = 0; i < A.Length - 1; i++)
        {
            if (A[i] == K)
            {
                count++;
            }
        }
        if (count == 0)
            return false;
        else
            return true;
    }
爪哇岛

评论

1赞 ebo 8/16/2014
我不确定你在这里问什么,似乎当前代码已经返回了指定的输入。false
0赞 lexicore 10/25/2014
@EricBouwers 请注意,不会迭代到最后。for
0赞 lexicore 10/25/2014
该函数究竟应该做什么?任务是如何制定的?它应该只适用于 {1, 3, 3} 还是任何 int 数组和 int K?
0赞 greenHorn 2/5/2019
@WindSwept:你得到这个问题的正确解决方案了吗?

答:

2赞 MATT RODO 3/9/2016 #1

我相信这是一个解决方案。

public static bool solution(int[] A, int K)
{

    int n = A.Length;
    for (int i = 0; i < A.Length - 1; i++)
    {
        if (A[i] + 1 < A[i + 1])
            return false;
    }
    if (A[0] == 1 || A[n - 1] != K)//Change here && to ||
        return false;
    else
        return true;

} 
-1赞 Ahmad Faisal 5/27/2018 #2

正确答案代码如下:

public boolean solution(int[] A, int k) {
    int n = A.length;
    for (int i = 0; i < n - 1; i++) {
        if (!(A[i] == A[i + 1]) && !(A[i] == A[i + 1] - 1)) {
            System.out.println(A[i] + "-->" + A[i + 1]);
            return false;

        }
    }

    if (A[0] != 1 || A[n - 1] != k) {
        return false;
    } else {
        return true;
    }

}
-1赞 greenHorn 2/5/2019 #3

如果最初为 for 循环定义的条件可以更改如下以使代码正常工作(如果 K 值与 Array 的元素匹配,则返回 true)

public static bool solution(int[] A, int K)
{

    int n = A.length;
    for (int i = 0; i < A.length; i++)
    {
        if (A[i] == K) // This is the changed condition 
            return true;
    }
    if (A[0] == 1 || A[n - 1] != K)
        return false;
    else
        return true;

} 

评论

0赞 default locale 2/5/2019
A[0] == 1部分似乎没有必要
1赞 greenHorn 2/5/2019
是的,但是问题陈述有一个条件,即最多只能更改 2 行代码,因此与所述规则保持一致,仅纠正了逻辑
0赞 default locale 2/5/2019
哦,我没注意到你已经换了两行了,对不起。尽管如此,这个条件还是打破了逻辑,代码将返回 true,因为 a={3,3,3} 和 k = 2。
0赞 default locale 2/5/2019
恐怕还是行不通。对于 a={1,2,3} 和 k= 3,它将返回 false
0赞 greenHorn 2/5/2019
更改了第二个if条件(将&&运算符替换为||运算符),请告诉我这是否有效
-1赞 Ashish Shetkar 1/13/2020 #4

这在 Java 8 中是可能的

您需要进行以下更改

1 - 更改 FOR 循环中的 IF 条件 - 创建一个 Integer 类型的列表,然后选中 contains 注意 - int 列表将不起作用 - 包含将不起作用

2 - 返回 true 的第二个 return 语句

这就是您如何通过仅更改 2 行来完成它

public static  boolean sol (int[] a , int k){

    int n = a.length;

    for(int i=0;i<n-1;i++){
        if(! Arrays.stream( a ).boxed().collect( Collectors.toList() ).contains(k)){
            return false;
        }
    }
    if(a[0]!=1 && a[n-1]!=k){
        return true;
    }
    else{
        return true;
    }
}
0赞 Oakroot 10/25/2022 #5

好吧,伙计们,我明白了!虽然不是 100%,但条件是 2 行我改了 3 行,所以如果你看到我们如何将其减少到两行,拍摄:

public class Solution {

public boolean solution(int[] A, int K) {
    int n = A.length;
    for (int i = 0; i < n - 1; i++) {
        if (A[i] + 1 == A[i + 1] && A[i]+1 == K){ // for wouldn't stop at K, now it does.
            // System.out.println("true"); for testing
            return true;
        }
    }
    if (A[0] != 1 || A[n - 1] != K) { //changed && to || for 0 value in array if we don'tcan't have 0 in array then we can keep && and this solution would meet req of 2 lines changed
        // System.out.println("false"); for testing
        return false;
    } else {
        // System.out.println("true"); for testing
        return true;
    }
}