给定一个String字符串,输出每个字符的个数(用数组解决)
e.g:现在有一个字符串 ygyewufygef
那么输出结果 y:3 g:2 e:2 w:1 u:1 f:2
这里会有两个方法:第一个是我自己写的,第二个是班上大佬写的,看了之后我直呼牛批。(大佬写的不一定是最优解,但在我看来已经很牛了,如果有更好的方法欢迎分享哦~)
package test07;
import java.util.Arrays;
public class Str {
public static void main(String[] args) {
String str="ygyewufygef";
count(str);
}
private static void count(String str) {
char a[]=str.toCharArray();
char word[]= {a[0]}; //第一个不用判断
for (int i = 1; i < a.length; i++) { //从第二个开始
for (int j = 0; j < word.length; j++) {
if(a[i]==word[j]) {
break;
}else if(j==word.length-1){
word=Arrays.copyOf(word, word.length+1); //对word数组扩容并赋值
word[j+1]=a[i];
}
}
}
//System.out.println(Arrays.toString(word)); 前面部分是先将不同的字母筛选出来
int num[]=new int[word.length];
for (int i = 0; i < word.length; i++) {
for (int j = 0; j < a.length; j++) {
if(word[i]==a[j])
num[i]++;
} //最后计数每个字母的个数
System.out.print(word[i]+":"+num[i]+" ");
}
}
}
运行结果:
这个↑是我写的,大概算法思想是:遍历原数组,与所求word数组(记录不同的字母)中的元素进行比较。若有相同元素,直接break,若将所求数组遍历完依旧没有相同元素,加入word数组中。然后再遍历,出现了对应字母num数组对应值+1。(是不是超级麻烦……这是之前学数据结构留下的算法思想,,或许是吧……)
package day06;
import java.util.Scanner;
public class TongJi {
public static void getSum(String str) {
char s[] = str.toCharArray();
int a[]=new int[26];
for(int i=0;i<s.length;i++) {
a[s[i]-'a']++;
}
for(int i=0;i<a.length;i++) {
if(a[i]!=0)
System.out.println((char)(i+97)+":"+a[i]);
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("请输入字符串:");
String s = input.next();
getSum(s);
}
}
运行结果:
这是↑大佬写的,大概算法思想是:new一个长度为26(26个字母)的a数组,遍历原数组,遇到一个字母则将a数组中对应的元素+1(即字母a对应下标为0的元素,z字母对应下标25元素),最后输出这个数组。牛牛牛!!!呀!我怎么没想到!!
总结:(写给我自己看的,大家可以不用看,,前提得是有人看到这篇文章。。哈哈)
知道了自己很菜(虽然早就清楚……),平时多去学习别人的算法思想,让自己能想得更广更深。
虽然大佬写的很牛批,但是牺牲了很多空间。大部分情况下,要想减小时间复杂度,就得牺牲空间复杂度,当然也有特优秀的,两者都顾及了。而且大佬写的代码适用性不高,若是改成大小写字母共存或者数字等就得修改一些地方。