JS:重复​​的字符串(Hackerrank挑战)

时间:2018-11-27 23:07:22

标签: javascript algorithm

我正在执行Hackerrank的挑战之一,如下所示:

  

Lilah的字符串s重复小写   无限次。

     

给出一个整数n,在其中找到并打印字母a的数量   Lilah无限字符串的前n个字母。   第一行包含单个字符串s。   第二行包含一个整数n。

我需要打印一个整数,该整数表示通过无限次重复S所创建的无限字符串的前N个字母中的字母a的数量。

例如:

  

s是'aba',n =10。无限字符串的前n = 10个字母   是“ abaabaabaa ...”,因为有7个,我们将得到7作为最终答案

这是我的答案。它通过了前两个案件,但未通过其余案件。

function repeatedString(s, n) {
    var repeat = Math.round(n / s.length);
    var remainder = n % s.length;
    var answer = 0;
    for (var i = 0; i < s.length; i++) {
        if (s.charAt(i) == 'a') {
            answer += repeat;
            if (i < remainder)
                answer++;
        }
    }
    return answer;
}

如果有人可以看一下并提出更好的解决方案,那就太好了。

24 个答案:

答案 0 :(得分:2)

任何想在HackerRank上看到原始问题的人都可以这样做here(也包括在下面)。问题陈述是:

打印一个整数,该整数表示通过无限次重复n创建的无限字符串的前s个字母中的字母a的数量。

这有两部分。

  1. s被“无限地”重复,但是我们只需要检查长度n
  2. 我们将需要计算该字符串中a的数量。

让我们首先从一个简单的问题开始:编写一个函数,该函数计算字符包含在字符串中的次数。

String.prototype.countCharacter = function(char) {
    return [...this].filter(c => c === char).length;
}

console.log('aaaa'.countCharacter('a')); // 4
console.log('aabb'.countCharacter('b')); // 2

现在这是棘手的部分。我们可以天真地使用String.repeat()来重复字符串,直到其长度大于n,但是对于任意大的n,这变得不切实际。实际上,HackerRank给我们提供了一个比max string length大的n测试用例,因此我们将需要采用更高级别的方法。

我们知道字符串s中将重复多少个a-如果重复m次,则将有m * s.countCharacter('a')个a,其中m > (n/l)并且ls.length。这并不像看起来的那么复杂:我们将需要重复该字符串,直到获得一个长度大于n的字符串为止,并且我们可以存储需要重复该字符串达到(或遍历)n到一个名为repeatsRequired的变量中,该变量仅被四舍五入。

从那里开始,很容易分辨出该字符串有多少个字符,并且我们可以用n / l来判断有多少 extra 个字符。如果我们知道最后会有多少个额外的字符,我们可以将charactersRequired % l的多余部分切掉,并计算a的数量,a的总数将是:

s

(number of a's in s) * (repeats required - 1)
+ (number of a's in final partial repeat)

HackerRank problem description.

答案 1 :(得分:1)

第一个错误是您对Math.round的呼叫应为Math.floor。您可以验证代码是否正常工作,因为您的代码指出repeatedString('cat', 2)为2,应该为1。

在再次提交之前,您应该另外手动进行几次健全性检查。

答案 2 :(得分:1)

Widget build(BuildContext context) {
  return Scaffold(
    body: SafeArea(
      child: Column(
        children: <Widget>[
          Chewie(
            controller: _chewieController,
          )
        ],
      ),
    ),
  );
}

答案 3 :(得分:0)

``javascript`:

函数repeatString(s, n) {

        if (s.includes("a") && n > 0)
        {
            var m = (n / s.Length);
          
             let matchCnt = 0;


            matchCnt =  (s.match(/a/g) || []).length;
                

            
            if (s.Length == matchCnt)
            {
                return n;
            }
            else
            {
                if (n == s.Length)
                {
                    return matchCnt;
                }
                else if (n < s.length)
                {
                    var newStr = s.Remove(Convert.ToInt32(n));
                    var newStr = s.substring(n)
                    newStr = s.replace(newStr, "");
                    matchCnt =  (newStr.match(/a/g) || []).length;
                
                    return matchCnt;
                }
                else
                {
                    if (n % s.length == 0)
                    {
                        return matchCnt * n;
                    }
                    else if (n % s.length != 0)
                    {
                        var extra = n % s.length;

                          if (extra > 1)
                        {
                            return  (n / s.length) * matchCnt;
                        }
                        else
                        {
                            return extra + (n / s.length) * matchCnt;
                        }
                    }
                }
            }
        }
        return 0;
}

c#: 公共静态长重复字符串(字符串 s,长 n) { char str = 'a';

        if (s.Contains("a") && n > 0)
        {
            var m = (Convert.ToDouble(n) / s.Length);
            var matchCnt = s.Count(x => x == str);
            if (s.Length == matchCnt)
            {
                return n;
            }
            else
            {
                if (n == s.Length)
                {
                    return matchCnt;
                }
                else if (n < s.Length)
                {
                    var newStr = s.Remove(Convert.ToInt32(n));
                    matchCnt = newStr.Count(x => x == str);
                    return matchCnt;
                }
                else
                {
                    if (n % s.Length == 0)
                    {
                        return matchCnt * n;
                    }
                    else if (n % s.Length != 0)
                    {
                        var extra = n % s.Length;

                          if (extra > 1)
                        {
                            return  (n / s.Length) * matchCnt;
                        }
                        else
                        {
                            return extra + (n / s.Length) * matchCnt;
                        }
                    }
                }
            }
        }
        return 0;
}

答案 4 :(得分:0)

function repeatedString(s,n) {

    if(s.includes('a')) {
  
      const sTotal = Math.floor(n / s.length); // repeated string total 
      const aCount = s.match(/a/g).length; // 'a' character count in s
      let aTotalCount = sTotal * aCount; // total 'a' count of repeated string pattern within number limit
      const remainingChar = n % s.length;  // remaining characters after repeating string within number limit
      
     // if there are remaining characters, add them to the total 'a' count. 
      if(remainingChar !== 0 && s.substr(0,remainingChar).includes('a')) {
          aTotalCount += s.substr(0,remainingChar).match(/a/g).length;
      }
        
      aTotalCount = Math.floor(aTotalCount);
      return aTotalCount;
      
    } else {
      return 0;
    }

}

这是我想出来的。在所有 22 个测试用例中通过 Hacker Rank 验证。

答案 5 :(得分:0)

我最近接受了这个挑战,通过首先过滤掉给定字符串中出现的模式并将其乘以字符串的出现来解决它。第 2 步是检查字符串出现是否完成,如果没有完成,则在子字符串中查找模式:

function repeatedString(s, n) {
let count = s.split('').filter(el => el === 'a').length;
count *= Math.floor(n/s.length);

if ((n % s.length) !== 0) {
    const subStr = s.slice(0, n % s.length );
    const patterStr = subStr.split('').filter(el => el === 'a');
    count += patterStr.length;
}

return count;
}

答案 6 :(得分:0)

const repeatedString = (s, n) => {
   const lengthOfS = s.length;
   const numberOfAInS = s.split('').filter(item => item === 'a').length;
   let aInRest = 0;
   if (n % lengthOfS !== 0) {
   aInRest = s
     .slice(0, n % lengthOfS)
     .split('')
     .filter(item => item === 'a').length;
   }
   return parseInt(n / lengthOfS) * numberOfAInS + aInRest;
};

答案 7 :(得分:0)

这是一个蛮力和非蛮力方法

console.log(repeatedString('abab',1000))
console.log(repeatedStringBruteForce('abab',1000))

function repeatedStringBruteForce(s, n) {
    var stringLength = s.length;
    var charIndex = 0;
    for (var i = stringLength; i < n; i++) {
        s += s[charIndex];
        charIndex++;
    }

    return s.split('a').length - 1
}

function repeatedString(s, n) {
    // Get number of A's in original given string
    var aNum = s.split('a').length - 1;
    // Calculate number of given strings that fit into n
    var numOfStrings = Math.floor(n / s.length);
    // Get Total Number A's by multiplying the number of strings that fit by the number of A's in original string
    var totalAs = aNum * numOfStrings;
    // Now get the remainder string that couldnt fit
    var remainder = (n % s.length)/s.length;
    var leftOverStringLength = Math.floor(remainder * s.length);
    // Get the left over substring 
    var leftOverString = s.substring(0, leftOverStringLength);
    // Add any left over A's to our total A's
    totalAs += leftOverString.split('a').length - 1;

    return totalAs
}

答案 8 :(得分:0)

下面确实通过了 java 8 中的每个测试用例!!

static long repeatedString(String s, long n) {
        int size = s.length();
        long total = 0;
        int count = 0;
        for(int i =0;i<size;i++){
            if(s.charAt(i)=='a'){
                total++;
                if(i<(n % size))
                count++;
            }
        }
        long repeat = (long)n/size; 
        total = total*repeat;
        return total+count;

    }

答案 9 :(得分:0)

static long repeatedString(String s, long n) {        
        long count =0;
        for(char c : s.toCharArray())
            if(c == 'a')
            count++;

         long factor = (n/s.length());
         long rem = (n%s.length());
         count =  factor*count  ;
        for(int i=0;i<rem;i++)
            if(s.charAt(i)=='a')
                    count++;  
            return count;
        
        }

答案 10 :(得分:0)

这是我对此的答案。通过所有测试,但显然没有优化。

    driver.execute_script("return arguments[0].scrollIntoView(true);", element)
    
    time.sleep(3)
    driver.execute_script("window.scrollBy(0, -100);")
    time.sleep(2)
    #above code ensures drop list is visible, otherwise we get errors of non clickable etc.

    element = driver.find_element_by_class_name("stats-table__filter")
    season_element = element.find_elements_by_tag_name("li")
    for season in season_element:
        action.move_to_element_with_offset(element,0,0).perform()
        element.click()
        action.move_to_element_with_offset(season,0,0).perform()
        time.sleep(2) 

        try:
            print("clicking:",season.text )
            season.click()
        except WebDriverException:
            print("Not clickable", season.text)
            break

答案 11 :(得分:0)

查看我的答案,您可以使用两个小功能来获得更好的性能。所有测试均正确通过。 I am attaching the benchmark comparing with other methods that use .split, .replace, .filter, .match

function countAs(str, ln) {
  let count = 0;
  for (let i = 0; i < ln; i++) {
    if (str[i] === 'a') {
      count++;
    }
  }
  return count;
}

function repeatedString(s, n) {
    return (
        countAs(s, s.length) * parseInt(n / s.length, 10) +
        countAs(s, n % s.length)
    );
}

答案 12 :(得分:0)

我尝试了迭代,但是出现运行时错误。因此,采用的方法是使用很少的数学运算。这是我的Java代码。

    long left = n % s.length();
    long most = s.chars().filter(c -> (char) c == 'a').count();
    long last = s.substring(0, (int) left).chars().filter(c -> (char) c == 'a').count();
    long repeated = n / s.length();

    return most * repeated + last;

答案 13 :(得分:0)

这个问题似乎是字符串问题,但实际上只是数学问题。简单的计算。首先计算子字符串中有多少个“ a”。然后id子串的长度是n的完美因子,然后length *(n / substrlength)是ans。否则,如果它不是一个完美的因素,则在剩下的(n%substrlength)字符串中找到多少个“ a”,只需将其添加到初始结果中即可。 // C ++中的代码

long len;
long i;
long count=0,c=0;
long fact=0;
len=s.length();
string s1=s;
for(i=0;i<s.length();i++)
{
    if(s[i]=='a')
    {
        count++;
    }
}
fact=n/len;
long sum=count*fact;
if(n%len==0)
{
    return sum;
}
else
{
    for(i=0;i<n%len;i++)
    {
        if(s[i]=='a')
        c++;
    }
    return sum+c;
}

}

答案 14 :(得分:0)

let finalCounter;

if (s.length === 1 && s==='a') {
  return n;
} else if (s.length === 1 && s !=='a') {
  return 0;
}

const aCounter = (s.match(/a/g)||[]).length;
if (aCounter === 0) {
  return 0;
}
const times = Math.floor(n/s.length);
const counterExact = aCounter * times;
const remainCount = n%s.length;
const substr = s.substring(0, remainCount);
const extraCounter = (substr.match(/a/g)||[]).length;
finalCounter = counterExact+extraCounter;
return finalCounter;

答案 15 :(得分:0)

//From a website i found it.

 const as = s.split("").filter(c => c === "a").length;
        const times = parseInt(n / s.length);
        const rest = n % s.length;

        const totalAs = times * as
            + s.slice(0, rest).split("").filter(c => c === "a").length

        return totalAs; 

答案 16 :(得分:0)

#include<iostream>
#include<string.h>
using namespace std;
int main()
{
char s[101];
cin>>s;
long long n;
cin>>n;
int count=0;
for(int i=0;i<strlen(s);i++)
{
    if(s[i]=='a')
    count++;
}
long long d = (n/strlen(s))*count;
long long m = n%strlen(s);
for(int i=0;i<m;i++)
{
    if(s[i]=='a')
    d++;
}
cout<<d;
}
//Correctly working solution

答案 17 :(得分:0)

   long repeateCount=0;
int length =s.length();
long remainder=n%length;
int repeateCountForRemainder=0;

for(int i =0;i<length;i++){
    if(s.charAt(i)=='a'){
        repeateCount++;
    }
}

if(remainder !=0 && remainder>length){
    remainder=length;
}
for(int i =0;i< remainder;i++){

    if(s.charAt(i)=='a'){
        repeateCountForRemainder++;
    }
}

repeateCount = ((n-remainder)*repeateCount/length)+ repeateCountForRemainder;

答案 18 :(得分:-1)

def repeatedString(s, n):

  aois = s.count('a')
  soq = math.floor(n/len(s))
  sol = n-(soq*len(s))
  sl= s[0:int(sol)]
  aoisl = sl.count('a')
  return int(((aois*soq)+aoisl))

答案 19 :(得分:-1)

以下代码适用于5个测试用例。

对于其他情况,它未能引发运行时错误。

static long repeatedString(string s, long n)
{
    int count = 0, k = 0;
    do {
        n--;
        if (s[k] == 'a') {
            count++;
        }
        if (k==s.Length-1) {
            k = -1;   
        }
        k++;
    } while (n>=0);
        return count;
    }
}

答案 20 :(得分:-1)

function repeatedString(s, n) {
    return (s.match(/a/g) || []).length * Math.floor(n/s.length) + (s.substring(0, n % s.length).match(/a/g) || []).length;
}

答案 21 :(得分:-1)

const computeNumOfReapitedA = (s) => {

    return s.split('').filter(character => {
        return character === 'a';
    });
};

const computeNumOfOccurrences = (s, numOfChars) => {

    let quotient = Math.floor(numOfChars/s.length);
    let remainder = numOfChars % s.length;

    return computeNumOfReapitedA(s).length * quotient + computeNumOfReapitedA(s.substr(0, 
           remainder)).length;  
};

答案 22 :(得分:-1)

// Complete the repeatedString function below.
static long repeatedString(String s, long n) {
    long stringLength = s.length();
    char[] charArray = s.toCharArray();
    int count=0;
    if(s.equals("a")){
        return n;
    }
    for(char character : charArray){
        if(character == 'a'){
            count++;
        }
    }
    int rem = (int)(n % stringLength);
    count *= (n/stringLength);
    if(rem != 0){
        char[] subString = s.substring(0,rem).toCharArray();
        for(char character : subString){
            if(character == 'a'){
                count++;
            }
        }
    }
    return count;
}

答案 23 :(得分:-1)

    int l=s.length();
    String ne="";
    long value=0;
    if(l==1&&s.charAt(0)=='a')
    {
        value=n;
    }

    else
    {
        value=0;
        for(int i=0;i<=(n/l)+1;i++)
        {
            ne=ne+s;
        }
        for(int i=0;i<n;i++)
        {
            if(ne.charAt(i)=='a')
            {
                value++;
            }
        }
    }
    return value;