计算无限字符串中字母的出现

时间:2018-11-01 00:47:23

标签: java arrays string for-loop character

我有一个名为datetime的以下字符串,该字符串可以无限次重复。这意味着s="abcac"看起来像:s,而s="abcacabcacabcacabcacabcac...."代表n的子字符串。

例如,如果ss="monday",我们考虑的子字符串将是n="10",因为无限字符串将是finalString="mondaymond",{的前10个字符{1}}是"mondaymondaymondaymonday..."

我正在尝试计算s中字母“ a”的出现。该代码正常运行,但是当n> 1000000时,该程序将无法运行。

此外,如果我将"mondaymond"finalString更改为n,则for循环在这种情况下将无法工作。

该问题的解决方案是什么?

int

3 个答案:

答案 0 :(得分:2)

我建议找出基本字符串重复多少次,并使用此信息来计算字母的出现次数,以及末尾额外子字符串出现的次数。例如:

String s = "monday";
int n = 10;
String chr = "a";

int baseNum = s.length() - s.replace(chr, "").length();
int baseCnt = (n / s.length()) * baseNum;
int index = n % s.length();
String left = s.substring(0, index);
int finalCnt = left.length() - left.replace(chr, "").length();
int totalCnt = baseCnt + finalCnt;

System.out.println("There were " + totalCnt + " letter " + chr + ".");

这里的基本思想是效率。实际上,我们不需要创建和使用任意长度的字符串,因为我们知道它只是重复相同的子字符串。取而代之的是,我们可以只计算子字符串中的出现次数,并通过子字符串重复多少次来预测总数。

答案 1 :(得分:1)

您不需要构造最终字符串。您只需要计算s字符串中'a'(或任何您想要的)的出现次数,并计算此s重复的次数。毕竟,在提醒中计算“ a”的出现。

long countInS = // count all occurances of 'a'
long repeats = n / s.length;
long reminder = n % s.length;
String sReminder = s.substring(reminder);
long countInReminder = // count all occurances of 'a' in sReminder 
long count = repeats * countInS + countInReminder;

无需浪费您的RAM

答案 2 :(得分:1)

正如其他答案中已经指出的那样,您不需要构建最终字符串。

这是我的解决方法:

ActiveRecord::AssociationTypeMismatch (Ingredient(#70235637684840) expected, got {"text"=>"First Ingredient"} which is an instance of ActiveSupport::HashWithIndifferentAccess(#70235636442880))