Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算无限字符串中字母的出现次数_Java_Arrays_String_For Loop_Character - Fatal编程技术网

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

Java 计算无限字符串中字母的出现次数,java,arrays,string,for-loop,character,Java,Arrays,String,For Loop,Character,我有一个名为s=“abcac”的字符串,它被无限重复多次。这意味着s将类似于:s=“abcacabcac…”和n表示s的子字符串 例如,如果 s=“星期一” >代码> n=“10”,我们考虑的子字符串将是“代码> FialString=MunayMund < /Cald>,因为无限字符串将是代码< MunDayMayDayMayDayMayDay.”,前10个字符 “蒙大蒙” < /P> 我正试图计算字母“a”在finalString中出现的次数。此代码工作正常,但是当n>1000000时,程序

我有一个名为
s=“abcac”
的字符串,它被无限重复多次。这意味着
s
将类似于:
s=“abcacabcac…”
n
表示
s
的子字符串

例如,如果<代码> s=“星期一”<代码> >代码> n=“10”<代码>,我们考虑的子字符串将是“代码> FialString=MunayMund < /Cald>,因为无限字符串将是代码< MunDayMayDayMayDayMayDay.”,前10个字符<<代码> s/COD> <代码>“蒙大蒙” < /P> 我正试图计算字母“a”在
finalString
中出现的次数。此代码工作正常,但是当n>1000000时,程序将无法工作

此外,如果我将
n
int
更改为
long
,则在这种情况下for循环将不起作用

这个问题的解决办法是什么

public static void main(String[] args){

            String s="abcac";
            int aCount=0;
            int n=1000;
            int j=0;


            char[] sCharArray=s.toCharArray();

            char[] finalString = new char[n];

            for(int i=0;i<n;i++){

                if(j==s.length())
                    j=0;

                finalString[i]=sCharArray[j];
                j++;


            }


            for(int i=0; i<n;i++){
                if(finalString[i]=='a')
                    aCount++;
            }


    System.out.println(aCount);

            }
publicstaticvoidmain(字符串[]args){
字符串s=“abcac”;
int aCount=0;
int n=1000;
int j=0;
char[]sCharArray=s.toCharArray();
char[]finalString=新字符[n];

对于(int i=0;i,我建议查找基本字符串的重复次数,并使用此信息计算字母的出现次数,加上最后额外子字符串的出现次数。例如:

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 + ".");

这里的基本思想是效率。我们实际上不需要创建和处理任意长度的字符串,因为我们知道它只会重复相同的子字符串。相反,我们可以只计算子字符串中出现的次数,并根据该子字符串重复的次数来预测总数。

我建议找到基字符串的多少倍字符串重复,并使用此信息计算字母的出现次数,再加上最末端额外子字符串的出现次数。例如:

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 + ".");

这里的基本思想是效率。我们实际上不需要创建和处理任意长度的字符串,因为我们知道它只会重复相同的子字符串。相反,我们可以只计算子字符串中出现的次数,并根据该子字符串重复的次数来预测总数。

您不需要构建最终的子字符串铃声。你只需要在
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;

无需浪费内存,无需构建最终字符串。只需在
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;

不需要浪费内存

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

以下是我的解决方案:

public static void main(String[] args){
    String s = "abcacas";
    long n = 1000000;

    long count = getCount(s, n, 'a');
    System.out.println(count);
}

private long getCount(String str, long n, char c) {
    int length = str.length();

    long repeats = n / length;
    long reminder = n % length;

    long count = 0;
    for (int i = 0; i < length; i++) {
        if (str.charAt(i) == c) {
            count += repeats;
            if (i < reminder) {
                count++;
            }
        }
    }
    return count;
}
publicstaticvoidmain(字符串[]args){
字符串s=“abcacas”;
长n=1000000;
long count=getCount(s,n,'a');
系统输出打印项次(计数);
}
私有长getCount(字符串str,长n,字符c){
int length=str.length();
长重复次数=n/长度;
长提醒=n%长度;
长计数=0;
for(int i=0;i
正如其他答案中所指出的,您不需要构建最终字符串

以下是我的解决方案:

public static void main(String[] args){
    String s = "abcacas";
    long n = 1000000;

    long count = getCount(s, n, 'a');
    System.out.println(count);
}

private long getCount(String str, long n, char c) {
    int length = str.length();

    long repeats = n / length;
    long reminder = n % length;

    long count = 0;
    for (int i = 0; i < length; i++) {
        if (str.charAt(i) == c) {
            count += repeats;
            if (i < reminder) {
                count++;
            }
        }
    }
    return count;
}
publicstaticvoidmain(字符串[]args){
字符串s=“abcacas”;
长n=1000000;
long count=getCount(s,n,'a');
系统输出打印项次(计数);
}
私有长getCount(字符串str,长n,字符c){
int length=str.length();
长重复次数=n/长度;
长提醒=n%长度;
长计数=0;
for(int i=0;i
非常感谢。这是纯粹的“数学”我正在寻找的算法!非常有效,没有循环或重复数组。实际上,此解决方案不包括@Yasserkabout在问题中提到的
n
类型更改为
long
。@ETO我已将算法修改为long。数学方法更好。。你认为呢?@ETO你呢是的,但是
String#length()
返回一个整数,而不是一个长字符串,因此从理论上讲,无限字符串的长度不能不适合整数。无论如何,这个问题更多的是关于算法,而不是你提到的问题。@Yasserkabout好吧,这三个解都有相同的数学方法。理论上
s
可能是一个非常大的数字(最多可达MAX_INT)。我建议在这种情况下避免使用
.substring
.replace
,因为在我的情况下,它们的聚合复杂度远不止O(n)。非常感谢。这是纯粹的“数学”问题我正在寻找的算法!非常有效,没有循环或重复数组。实际上,此解决方案不包括@Yasserkabout在问题中提到的
n
类型更改为
long
。@ETO我已将算法修改为long。数学方法更好。。你认为呢?@ETO你呢是的,但是
String#length()
返回一个整数,而不是一个长字符串,因此从理论上讲,无限字符串的长度不能不适合整数。无论如何,这个问题更多的是关于算法,而不是你提到的问题。@Yasserkabout好吧,这三个解都有相同的数学方法。理论上<代码