我有一个名为datetime
的以下字符串,该字符串可以无限次重复。这意味着s="abcac"
看起来像:s
,而s="abcacabcacabcacabcacabcac...."
代表n
的子字符串。
例如,如果s
和s="monday"
,我们考虑的子字符串将是n="10"
,因为无限字符串将是finalString="mondaymond"
,{的前10个字符{1}}是"mondaymondaymondaymonday..."
我正在尝试计算s
中字母“ a”的出现。该代码正常运行,但是当n> 1000000时,该程序将无法运行。
此外,如果我将"mondaymond"
从finalString
更改为n
,则for循环在这种情况下将无法工作。
该问题的解决方案是什么?
int
答案 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))