另一种不滥用记忆的方式



嘿,我已经完成了这个问题,但我想知道是否有一种方法可以在不使用不必要的内存的情况下完成它,同时仍然使用数组。下面是问题和我的代码。

问题:实现一个名为preZee的方法,该方法将接受名为book的字符串参数。它将向屏幕输出每个"z"之前的字符数。

示例:如果字符串为:"我的房子很容易找到。去z街左转。这是一栋门上有黑色星星的房子。"

输出应为:13 z、16 z、29 z、27 z

代码:

import java.util.*;
public class preZee{
public static void main(String[] args){
  Scanner user=new Scanner(System.in);
  System.out.println("Please enter a sentence");
  String input=user.nextLine();

  int[] anarray;
  anarray=new int[input.length()];
  int count=0;
  for(int i=0;i<input.length();i++){
  String subst=input.substring(i,i+1);
     if(!(subst.equalsIgnoreCase("z"))){
     count ++; 
     }
     else{
     anarray[i]=count;
     count=0;
     }
   }
     for(int j=0;j<input.length();j++){
      if(anarray[j]!=0){
      System.out.print(anarray[j]+ "z ");
      }
     }   

}

}

类似的替代方案

for(int i=0;i<input.length();i++){
if(input.charAt(i)=='z'||input.charAt(i)=='Z')
system.out.println(i + " z");
}

不要使用子字符串。使用String.toCharArray()并在每次迭代中进行检查。子字符串将为每次迭代创建新的字符串。这太浪费了。

如果每次遇到'z'都重置计数器,则根本不需要数组,只需遍历输入字符串,如果字符不是z则递增,否则重置。通过每次重置当前计数器时将其附加到列表中来维护计数器列表。

也可以使用charAt()来获取字符串中的字符。

String.indexOf方法怎么样?

它返回字符第一次出现的索引,但您可以设置起点。这样可以避免使用子字符串。

也就是说,这真的不应该占用太多内存,所以除非你真的有内存问题,或者这是一个类的作业之类的,否则保留你所拥有的是可以的。

我之所以这么说,是因为您特别要求使用数组的答案。事实上,按照目前答案中人们告诉你的方式做会更好。

如果你的字符串真的很大,你将创建一个相同大小的int数组,这是浪费。因此,最好的做法是首先定义一个小得多的数组,比如字符串数组大小的十分之一,并将结果放在其中。保留一个计数器,告诉你看到了多少个"z",这样你就可以将字符数放在索引2的第三个"z"之前,依此类推。

现在,如果数组的大小不够大(如果z的计数达到数组的大小),您将不得不为更大的数组重新分配一些空间,并将结果复制到其中。请参阅调整数组大小。这样可以减少内存使用。

最后,使用for循环遍历数组并打印结果。

类似于@user3058333答案,但需要两个计数器来打印实际数字。我本想在他/她的回答中发表评论,但我没有足够的声誉发表评论。下面实际上给出了你提到的o/p。

    for(int i=0,j=0;i<input.length();i++,j++){
        if(input.charAt(i)=='z'||input.charAt(i)=='Z'){
            System.out.println(j + " z");
            j= -1;
            }
        }
    }

最新更新