有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

hackerrank中的java重复字符串问题获取时间限制问题

我正在解决重复字符串hackerrank问题。但是所有的测试用例都没有运行,可能是我的逻辑不正确。问题是这样的

repeated string problem

下面给出了我的代码,它由repeatedString和countingA函数组成,这些函数没有任何变量 i、 a,和无穷大的字符串

import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;

public class Solution {

    // Complete the repeatedString function below.
    static long repeatedString(String s, long n) {
        long i=1;
        String infinityString="";
        while(s.length()*i<=n)
        {
            infinityString+=s;
            i++;
        }
        if(s.length()%infinityString.length()==0){
           return countingA(infinityString); 
        }else{
            infinityString+=s.substring(0,(s.length()%infinityString.length())-1);
            return countingA(infinityString); 
        }
    }
    public static long countingA(String infinity)
    {   
        long a=0;
        for(int i=0;i<infinity.length();i++)
        {
            if(infinity.charAt(i)=='a')
            {
                a++;
            }
        }
        return a;
    }

    private static final Scanner scanner = new Scanner(System.in);

    public static void main(String[] args) throws IOException {
        BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));

        String s = scanner.nextLine();

        long n = scanner.nextLong();
        scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");

        long result = repeatedString(s, n);

        bufferedWriter.write(String.valueOf(result));
        bufferedWriter.newLine();

        bufferedWriter.close();

        scanner.close();
    }
}

共 (3) 个答案

  1. # 1 楼答案

    以下代码甚至在普通代码中也太慢,因为字符串串联分配了更大的字符串

        String infinityString = "";
        while (s.length()*i <= n) {
            infinityString += s;
            i++;
        }
    
        StringBuilder infinityStringB = new StringBuilder();
        while (s.length()*i <= n) {
            infinityStringB.append(s);
            i++;
        }
        String infinityString = StringBuilder.toString();
    

    还有人想:

        StringBuilder infinityStringB = new StringBuilder((int) n);
    

    我们可以看到:字符串不能容纳长n字符

    但是,您不需要重复的字符串:

    if (s.isEmpty()) {
        return 0;
    }
    long repititions = n / s.length();
    int remaining = (int)(n % s.length());
    String remainder = s.substring(0, remaining);
    
    return countAs(s) * repetitions + countAs(remainder);
    
  2. # 2 楼答案

    也许试试这个

    static long countA(String s, long n) {
        long totalCount = 0;
        long aCount = 0;
        long times = n / s.length();
    
        for(int i = 0; i < s.length(); i++) {    
            if(s.charAt(i) == 'a')    
                aCount++;    
        }
        totalCount =  times * aCount;
        aCount = 0;
        if(n%s.length() != 0) {
            for(int i=0;i<n - (times * s.length());i++)
                aCount++;
        }
        return totalCount + aCount;
    }
    
  3. # 3 楼答案

    也许你丢失的情况是^ { }的条件,然后需要计算额外的A。我也在C++中解决了这个问题,并使用了下面的逻辑

      static int numberOfAs(String s,long len){
            int val=0;
            for(int i=0;i<len;i++){
                if(s.charAt(i)=='a'){
                    val++;
                }
            }
            return val;
        }
    
        static long repeatedString(String s, long n) {
    
            int size = s.length();
            int noA = numberOfAs(s,s.length());// 1
            double val = Math.floor(n/size);
            if(s.length()%n==0){ // 2
                return noA*(long)val;
            }else{
                long countedA = (long)val * noA; //3
                long valsLeft = n-(long) (val*size); //4
                long letfA = numberOfAs(s,valsLeft); //5
                long ans = countedA + letfA; //6
                return ans;
            }
        }
    
    1. 计数所提供字符串中的a数,即s
    2. 当字符串s是总计数n的倍数时的条件,因此您只需要将s中的a的数量乘以n/s的结果
    3. n/s中存在的a的总数
    4. 在可除性之后的额外字符串,我们需要为此单独计算a
    5. 为额外字符串单独计算a
    6. 归还他们的总数

    希望这有帮助