java —— 统计单词数

题目详情

一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。
现在,请你编程实现这一功能,具体要求是:
给定一个单词,请你输出它在给定的文章中出现的次数和第一次出现的位置。
注意:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同(参见样例1 ),如果给定单词仅是文章中某一单词的一部分则不算匹配(参见样例2 )。

输入格式:

共2行。

第1行为一个字符串,其中只含字母,表示给定单词;

第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。

输出格式:

一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,分别是单词在文章中出现的次数和第一次出现的位置(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0 开始);如果单词在文章中没有出现,则直接输出一个整数−1。

限制:

1≤单词长度≤10。
1≤文章长度≤1,000,000。

样例1:

输入:
To
to be or not to be is a question

输出:
2 0

样例2:

输入:
to
Did the Ottoman Empire lose its power at that time

输出:
-1

代码如下:

方法一:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        str = str.toLowerCase();    // 把大写字母转换为小写字母 str = str.toLowerCase();
        String scr = sc.nextLine();
        String[] ch = scr.split(" ");  // 创建一个String数组 split(String regex) regex:表示分隔符,此处为空格
        if (Seek(ch, str) != 0){ // 如果分隔符为转义字符如“ . ” “ | ”,则要加上“ \\" 如split("\\.")
            int j = 0;
            for (int i = 0; i < ch.length; i ++){       // 如果找到第一个相等的就退出循环
                if (ch[i].toLowerCase().equalsIgnoreCase(str)) {
                    break;
                }else j += ch[i].length() + 1;
            }
            System.out.println(Seek(ch, str) + " " + j);
        }else
            System.out.println("-1");
    }

    public static int Seek(String[] a, String b){  // 查找String数组中是否存在字符串b
        int count = 0;
        for (int i = 0; i < a.length; i ++){
            if (a[i].toLowerCase().equalsIgnoreCase(b)) { // 字符串的比较要用 String.equals(String) 不能用==
                count ++;
            }
        }
        return count;
    }
}

知识点总结:

  1. .toLowerCase() :将大写字母转换为小写字母 ,格式:String = String.toLowerCase();
    .toUpperCase() :将小写字母转换为大写字母, 格式:String = String.toUpperCase();
  2. .equals() :字符串进行比较大小,由于双方为字符串因此不能使用“ == ”,只能使用 .equals();
  3. String[] :字符串数组的创建使用split(String regex),具体格式如下:
String[] str = String.split(String regex);
String[] str = String.split(String regex,int limit);

① String regex:代表的是分隔符,即字符串数组中,字符串之间的相分隔的符号,比如{“abc , acb , acd”},“,” 即为分隔符;
② int limit :代表的限制分隔后的数量;
③对于一些特殊分隔符”.” “\” “|” “*” 要进行转义加上**“\”**。

方法二:提供者(Jplusztx)

import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner stdIn = new Scanner(System.in);
        char[] word = stdIn.nextLine().toLowerCase().toCharArray(); // 从键盘输入全部转换为小写后存储在字符数组word中
        char[] sentence = stdIn.nextLine().toLowerCase().toCharArray(); // 从键盘输入全部转换为小写后存储在字符数组sentence中
        int count = 0, firstIndex = -1;  // count 代表出现的次数 firstIndex 代表出现的位置
        for (int i = 0; i < sentence.length; i++) {
            int cnt = 0;
            //如果句子中的第i个字母是单词的开头
            if (sentence[i] == word[cnt] && (i == 0 || sentence[i - 1] == ' ' )){ //i == 0 || sentence[i - 1] == ' '  判断是否是相同的字母开头
                for (; cnt < word.length; cnt++) {  // 比对单词是否相同
                    if (sentence[i + cnt] != word[cnt])
                        break;
                } // 判断下一位是否是结尾或者空格 从而判断其是否是一个单词
                if (cnt == word.length && (i + cnt == sentence.length || sentence[i + cnt] == ' ')){ 
                    count++;
                    if (firstIndex == -1) firstIndex = i;
                }
            }
            i += cnt;  // 跳过已查找的位置
        }
        if (firstIndex == -1){
            System.out.println(-1);
        }else {
            System.out.print(count + " " + firstIndex);
        }
    }
}

END