字符串类题
第一题:统计出现次数最多和最少次数,并判断差是否是质数
题目:题目描述
笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼。但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!
这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案。
输入格式
一个单词,其中只可能出现小写字母,并且长度小于100100。
输出格式
共两行,第一行是一个字符串,假设输入的的单词是Lucky Word,那么输出“Lucky Word”,否则输出“No Answer”;
第二行是一个整数,如果输入单词是Lucky Word,输出maxn-minn的值,否则输出00。
输入输出样例
输入 #1复制
error
输出 #1复制
Lucky Word
2
输入 #2复制
olympic
输出 #2复制
No Answer
0
说明/提示
【输入输出样例1解释】
单词error中出现最多的字母rr出现了33次,出现次数最少的字母出现了11次,3-1=23−1=2,22是质数。
【输入输出样例2解释】
单词olympic中出现最多的字母ii出现了11次,出现次数最少的字母出现了11次,1-1=01−1=0,00不是质数。
(本处原题面错误已经修正)
noip2008提高第一题
/**
*
* @author yyyy
*第一步:统计每个字母出现的次数
*第二:更新最大值和最小值
*第三:判断是否是质数
*/
import java.util.Scanner;
public class Main{
public static boolean sushu(int ans)
{
if(ans==1||ans==0)
return false;
for(int i=2;i<Math.sqrt(ans);i++)
{
if(ans%i==0)
return false;
}
return true;
}
public static void main(String[] args)
{
int max=0;int min=99999999;
Scanner in=new Scanner (System.in);
String a=in.nextLine();
char[] s=a.toCharArray();
int ans[]=new int[105];
for(int i=0;i<s.length;i++)//统计出现的次数
{
ans[s[i]-'a']++;
}
for(int i=0;i<26;i++)//更新最大值和最小值
{
if(ans[i]>max)max=ans[i];
if(ans[i]>0&&ans[i]<min)min=ans[i];
}
int bb=max-min;
if(sushu(bb)) {
System.out.println("Lucky Word");
System.out.println(bb);
}
else {
System.out.println("No Answer");
System.out.println("0");
}
}
}
第二题:统计目标单词出现次数和第一次出现的位置
题目:
题目描述
一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。
输入格式
共22行。
第11行为一个字符串,其中只含字母,表示给定单词;
第22行为一个字符串,其中只可能包含字母和空格,表示给定的文章。
输出格式
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从00 开始);如果单词在文章中没有出现,则直接输出一个整数-1−1。
输入输出样例
输入 #1复制
To
to be or not to be is a question
输出 #1复制
2 0
输入 #2复制
to
Did the Ottoman Empire lose its power at that time
输出 #2复制
-1
说明/提示
数据范围
1≤1≤单词长度≤10≤10。
1≤1≤文章长度≤1,000,000≤1,000,000。
noip2011普及组第2题
分析:
- 1.题目中没有说明大小写有区别,所以将所有内容转换为小写字母,或者大写字母都行
- 2.因为有空格,题目中没有要求空格也算在字符里,所以需要去掉空格,以空格来分割字符串(split(" "))
- 3.遍历,寻找是否有与目标相同的单词存在
- 4.在寻找第一次出现的位置这一部分代码中,需要注意的是,是否是在文章的的第一个单词出现,保证单词都是单独出现的,所以该字符串前后要拼接空格后再去匹配,返回的位置加1就是首次出现的位置.
import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main{
static int count,first;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner (System.in);
String key=in.next().toLowerCase();//目标单词
in.nextLine();//将字符缓冲区的数据用掉,就不会影响到下一次的输入
String s=in.nextLine().toLowerCase();//文章
String [] ss=s.split(" ");//将文章以空格切开,单词存入数组中
for(int i=0;i<ss.length;i++)
{
if(key.equals(ss[i]))
count++;
}
if(count==0)
System.out.println(-1);
else {
if(key.equals(s.substring(0,key.length()))) {//假如是开头,则判断目标单词长度,从文章中提取子串,再进行比较
first=0;
}
else {
first=s.indexOf(" "+key+" ")+1;
}
System.out.println(count+" "+first);
}
in.close();
}
}
作者:Better又
出处:https://www.cnblogs.com/lwyy1223-/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。