【问题标题】:Google Kickstart 2020 Round C: Countdown - Code Not WorkingGoogle Kickstart 2020 轮 C:倒计时 - 代码不工作
【发布时间】:2020-05-20 13:46:01
【问题描述】:

当我在 Google Kickstart 上提交代码时,我得到了第一个测试集的“错误答案”,即使示例输入和输出匹配。我真的不确定为什么 Google 不接受该代码。

The task 是给定一个 N 个正整数数组,求 K-倒计时的数量,其中 K-倒计时如果它的长度为 K 并且包含整数 K、K-1、K-2、...、2、1,则它是一个连续子数组。

输入:

输入的第一行给出了测试用例的数量,T.T 测试用例紧随其后。每个测试用例都以包含整数 N 和 K 的行开始。第二行包含 N 个整数。第i个整数是Ai。

输出:

对于每个测试用例,输出一行包含 Case #x: y,其中 x 是测试用例编号(从 1 开始),y 是她的数组中的 K 倒计时数。

示例输入:

3
12 3
1 2 3 7 9 3 2 1 8 3 2 1
4 2
101 100 99 98
9 6
100 7 6 5 4 3 2 1 100

样本输出:

Case #1: 2
Case #2: 0
Case #3: 1

我的逻辑非常简单:我有一个计数器变量 x,它从 K 开始,每当整数等于 x 时递减。如果发现倒计时(递减后x=0),则答案增加,x 设置为等于K。这是我的代码的症结所在:

    for(int i=0; i<n; i++) {
        arr[i]=sc.nextLong();
        if(arr[i]==x)
            x--;
        else 
            x=k;
        if(x==0) {
            ans++;
            x=k;
        }
    }

这是我的完整代码,以防出现任何微不足道的错误:

import java.util.Scanner;
public class Solution {
    static int t;
    static long n,k;
    static long[] arr;
    static Scanner sc=new Scanner(System.in);

    public static void main(String[] args) {
        t=sc.nextInt();
        for(int i=1; i<=t; i++) {
            n=sc.nextLong();
            k=sc.nextLong();
            System.out.println("Case #"+i+": "+solve());
        }
        sc.close();
    }

    public static long solve() {
        long x=k;
        long ans=0;
        arr=new long[(int)n];
        for(int i=0; i<n; i++) {
            arr[i]=sc.nextLong();
            if(arr[i]==x)
                x--;
            else 
                x=k;
            if(x==0) {
                ans++;
                x=k;
            }
        }
        return ans;
    }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    这是我在 o(n) 中运行的 cpp 代码

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    int t,m;
    cin>>t;
    m=t;
    while(t--){
        int n,k;
        cin>>n>>k;
        vector <int> v,v2;
        for(int i=0;i<n;i++){
            int tr;
            cin>>tr;
            v.push_back(tr);
        }
        for(int j=0;j<k;j++){
            int tr=k-j;
            v2.push_back(tr);
        }
        int fg=0;
        for(int i=0;i<n;i++){
            if(v[i]==k){
                    int count=0;
                for(int j=0;j<k;j++){
                    if(v2[j]==v[i+j])
                        count++;
                }
            if(count==k)
                fg++;
                }
            }
            cout<<"Case #"<<m-t<<": "<<fg<<endl;
        }
    }
    

    【讨论】:

    • 这不是一个有用的答案,尤其是考虑到这是一个与 java 相关的问题。
    【解决方案2】:

    假设数组中有一半的倒计时,后面的数字是K。 根据代码,该数字将被忽略,因此如果有以下倒计时,则不会计算在内。下面是主循环的样子:

    for (int i = 0; i < n; i++) {
        arr[i] = sc.nextLong();
    
        if (arr[i] == x)
            x--;
        else if (arr[i] == k)
            x = k-1;
        else 
            x = k;
    
        if (x == 0) {
            ans++;
            x = k;
        }
    }
    

    【讨论】:

      【解决方案3】:

      这是我在 java 中接受的代码:

      import java.util.*;
      
      public class Solution {
      
          public static int kCountDown(int [] nums, int k) {
              int length = nums.length;
              int endCounter = 0;
              int result = 0;
              for (int i=1; i<length; i++) {
                  if (nums[i - 1] - nums[i] == 1)
                      endCounter += 1;
                  else
                      endCounter = 0;
                  if (nums[i] == 1 && endCounter >= k - 1)
                      result += 1;
              }
              return result;
          }
      
          public static void main(String [] args) {
              Scanner sc = new Scanner(System.in);
              int test = sc.nextInt();
              for (int t=1; t<=test; t++) {
                  int n = sc.nextInt();
                  int k = sc.nextInt();
                  int [] nums = new int [n];
                  for (int i=0; i<n; i++) {
                      nums[i] = sc.nextInt();
                  }
                  System.out.println("Case #" + t + ": " + kCountDown(nums, k));
              }
          }
      }
      

      复杂度为 O(n),其中 n = 输入数组的长度

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多