import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
/**
* 题目: 给定一个字符串string str="中文字符**********************"
* 用程序求出现频率最高的字符,(要求写成函数,开发语言不限,不能直接调用系统方法。)
*
* @author david
*/
public class Problem_1 {
/**
* 不直接调用系统方法
*/
public void solve(String str) {
char[] cha=str.toCharArray(); //这个方法应该不算系统方法吧...难不成读数据的时候就要将字符一个个读到字符数组中?...
int[] num = new int[str.length()]; // 记录每个字符出现的次数,数组元素默认初值都为0,无需置零处理
boolean exist ; // 判断一个字符是否已经存在
int max = 1; // 记录最大次数的变量
int index = 0; // 记录出现频率最高的字符的下标
for (int i = 0; i < cha.length; i++) { // 对字符数组进行遍历
exist=false; //默认为不存在
// 判断该字符是否是已出现的字符
for (int j = 0; j < i; j++) { // 第一次不会进入循环
if (cha[i] == cha[j]) {
num[j]++; // 把出现次数累加到第一次出现该字符的位置
if (num[j] > max) { // 保存当前最大次数和字符下标
max = num[j];
index = j;
}
exist = true;
break;
}
}
// 第一次循环或该字符未在前面出现的情况
if (exist == false) {
num[i]++;
}
}
if (max == 1) { // 都是出现一次,无重复
System.out.println("该字符串无一字符重复,出现频率皆为1 !");
} else {
System.out.println("出现频率最高的字符为:\t" + cha[index]);
System.out.println("出现次数为:\t" + max);
}
}
/**
* 直接调用系统方法
*/
public void solve2(String str){
char[] cha =new char[str.length()];
Map<Character, Integer> map=new HashMap<Character,Integer>(); //使用哈希map
str.getChars(0, str.length(), cha, 0);
int max=1;
Character ch=null;
for (Character c : cha) {
if(map.containsKey(c)){ //这个方法应该算直接调用系统方法了
int num=map.get(c)+1;
map.put(c, num); //更新相应的值
if(num>max){ //记录最大值和该字符
max=num;
ch=c;
}
}else{
map.put(c, 1); //第一次加进map,把值置为1
}
}
if (max == 1) {
System.out.println("该字符串无一字符重复,出现频率皆为1 !");
} else {
System.out.println("出现频率最高的字符为:\t" + ch);
System.out.println("出现次数为:\t" + max);
}
}
/**
*可以测一下,如果存在有两个字符出现得一样多,那么出现次数先达到最大值的字符为频率最高的
*/
public static void main(String[] args) {
while (true) {
System.out.println("请输入目标字符串:");
Scanner input = new Scanner(System.in);
String str = input.next();
System.out.println("方案一:");
Problem_1 pro = new Problem_1();
pro.solve(str);
System.out.println("方案二:");
pro.solve2(str);
}
}
}
//以上全部内容皆可直接运行!欢迎大家找bug~
import java.util.Map;
import java.util.Scanner;
/**
* 题目: 给定一个字符串string str="中文字符**********************"
* 用程序求出现频率最高的字符,(要求写成函数,开发语言不限,不能直接调用系统方法。)
*
* @author david
*/
public class Problem_1 {
/**
* 不直接调用系统方法
*/
public void solve(String str) {
char[] cha=str.toCharArray(); //这个方法应该不算系统方法吧...难不成读数据的时候就要将字符一个个读到字符数组中?...
int[] num = new int[str.length()]; // 记录每个字符出现的次数,数组元素默认初值都为0,无需置零处理
boolean exist ; // 判断一个字符是否已经存在
int max = 1; // 记录最大次数的变量
int index = 0; // 记录出现频率最高的字符的下标
for (int i = 0; i < cha.length; i++) { // 对字符数组进行遍历
exist=false; //默认为不存在
// 判断该字符是否是已出现的字符
for (int j = 0; j < i; j++) { // 第一次不会进入循环
if (cha[i] == cha[j]) {
num[j]++; // 把出现次数累加到第一次出现该字符的位置
if (num[j] > max) { // 保存当前最大次数和字符下标
max = num[j];
index = j;
}
exist = true;
break;
}
}
// 第一次循环或该字符未在前面出现的情况
if (exist == false) {
num[i]++;
}
}
if (max == 1) { // 都是出现一次,无重复
System.out.println("该字符串无一字符重复,出现频率皆为1 !");
} else {
System.out.println("出现频率最高的字符为:\t" + cha[index]);
System.out.println("出现次数为:\t" + max);
}
}
/**
* 直接调用系统方法
*/
public void solve2(String str){
char[] cha =new char[str.length()];
Map<Character, Integer> map=new HashMap<Character,Integer>(); //使用哈希map
str.getChars(0, str.length(), cha, 0);
int max=1;
Character ch=null;
for (Character c : cha) {
if(map.containsKey(c)){ //这个方法应该算直接调用系统方法了
int num=map.get(c)+1;
map.put(c, num); //更新相应的值
if(num>max){ //记录最大值和该字符
max=num;
ch=c;
}
}else{
map.put(c, 1); //第一次加进map,把值置为1
}
}
if (max == 1) {
System.out.println("该字符串无一字符重复,出现频率皆为1 !");
} else {
System.out.println("出现频率最高的字符为:\t" + ch);
System.out.println("出现次数为:\t" + max);
}
}
/**
*可以测一下,如果存在有两个字符出现得一样多,那么出现次数先达到最大值的字符为频率最高的
*/
public static void main(String[] args) {
while (true) {
System.out.println("请输入目标字符串:");
Scanner input = new Scanner(System.in);
String str = input.next();
System.out.println("方案一:");
Problem_1 pro = new Problem_1();
pro.solve(str);
System.out.println("方案二:");
pro.solve2(str);
}
}
}
//以上全部内容皆可直接运行!欢迎大家找bug~