LeetBook简单题1的一些思考

题目:2114. 句子中的最多单词数
内容:
一个 句子 由一些 单词 以及它们之间的单个空格组成,句子的开头和结尾不会有多余空格。
给你一个字符串数组 sentences ,其中 sentences[i] 表示单个 句子 。
请你返回单个句子里 单词的最多数目。
实例:
输入:sentences = ["alice and bob love leetcode", "i think so too", "this is great thanks very much"]
输出:6
解释:
第一个句子 "alice and bob love leetcode" 总共有 5 个单词。
第二个句子 "i think so too" 总共有 4 个单词。
第三个句子 "this is great thanks very much" 总共有 6 个单词。
所以,单个句子中有最多单词数的是第三个句子,总共有 6 个单词。
输入:sentences = ["please wait", "continue to fight", "continue to win"]
输出:3
解释:可能有多个句子有相同单词数。
这个例子中,第二个句子和第三个句子(加粗斜体)有相同数目的单词数。

我一开始的问题:
1. 如何根据“,”来分割句子,而不是根据空格?
2. 如何计数每个句子里的单词?
3. 如何在主函数中运行出来?

使用到的函数:
split():根据匹配所定的正则表达式来拆分字符串,常用的是,- 空格等
键盘输入的nextLine函数:Scanner这个类中可以读入不同的数据类型的数据,其中,nextLine()则可以读入当前行的所有输入,直至行尾,并且返回的是字符串的形式。

代码如下:
1	import java.util.Scanner;
2	/*
3	计算句子中,最多的单词数
4	 */
5	class Solution {
6	   public int mostWordsFound(String[] sentences) {
7	      int max=0;
8	      for(int i=0;i< sentences.length;i++){
9	         int j = sentences[i].split(" ").length;
10	         max = Math.max(max,j);
11	      }
12	      return max;
13	   }
14	   public static void main(String args[]){
15	      Scanner scan = new Scanner(System.in);
16	      String s = scan.nextLine();
17	      String ss[] = s.split(",");
18	      Solution m = new Solution();
19	      int mm = m.mostWordsFound(ss);
20	      System.out.println(mm);
21	   }
22	}

我对该代码的解释:

  1. 静态方法不能引用非静态变量。main这个主函数是静态的方法,但是mostWordsFound方法是属于非静态方法,它的成员变量,即sentences是属于对象的属性,只有在实例化对象后才可以存在。
    因此,如果没有先将对象实例化,即Solution m = new Solution();就直接调用对象的方法,会出错。
  2. 在静态方法中调用非静态方法:
    2.1 将被调用的方法设置成静态方法;
    2.2 new本类,然后通过实例来调用。
  3. next Line()只能返回字符串,要搞成字符串数组,就通过split来分割这个字符串再放进数组里边。
  4. mostWordsFound中,由于sentences已经拆分成一个数组了,所以它的长度是几列来决定,j首先是按照空格将一列中的单词分开,然后计算分开后的长度。

我的想法:非静态成员方法(实例方法)要想被静态方法调用,就必须创建类的对象,然后再通过对象来使用这个方法。

因为对对象和类,静态方法与非静态方法都很晕,所以重新看了遍:

要了解清楚静态与非静态方法,需要先了解对象和类的区别:
对象:对象是类的实例,有状态和行为,例如一个人是一个对象,那么他的状态可能是喝水唱歌等等
类:类是模板,描述的是一类对象的状态和行为
LeetBook简单题1的一些思考
车是一个类,它的对象有状态:车的颜色,车的牌子,车的名称,有行为:加速,减速等等具体的东西。

对象的状态就是属性,行为是由方法体现。
类包含了成员变量和成员方法,对象是必须实例化。
对象要使用必须先声明是类的对象,并且实例化new分配个存储地址给对象使用。
对象的数据、方法的使用格式:
1. 对象名.成员数据
2. 对象名.成员方法(参数列表)
例如本题的例子中,Solution类包括了两种方法,分别是静态方法的主函数以及非静态成员方法mostWordsFound,mostWordsFound方法它返回的东西我需要,那我就要在主函数去调用这个方法来拿到我要的东西。但是静态方法不能调用非静态的任何东西,所以我决定先声明一个对象是Solution这个类的对象,然后用这个对象来使用成员方法。

静态与非静态方法的区别:
首先,两者本质上的区别是:静态方法是在类中使用static修饰的方法,在类定义的时候已经被装载和分配。
而非静态方法是不加static关键字的方法,在类定义时没有占用内存,只有在类被实例化成对象时,对象调用该方法才被分配内存。
其次,静态方法中只能调用静态成员或者静态方法,不能调用非静态方法或者非静态成员,
而非静态方法既可以调用静态成员或者方法又可以调用其他的非静态成员或者方法。

只是简单的学习,我希望之后不断加深后能完全用自己的语言去描述出来

上一篇:Java 问题定位工具 ——jstack


下一篇:20210611 word2vec 的代码实现