导言:
由于学JAVA还是三年前,虽然当时学得不错,但现在已经忘得差不多,所以对本科的PPT进行了复习,主要涉及到JAVA的基础编写规则,面向对象特性,数组,JAVA容器(主要是列表,集合和映射)。JAVA多线程等知识点并未复习,之后如有需要会进行复习。其中,应重点关注JAVA数组,JAVA容器和JAVA基础。其余的目前看来,不在考点之内。除了JAVA基础的复习,还有vivo的2道笔试真题。
1.JAVA笔记
1)JAVA基础
JAVA没有指针。
JAVA编写规则:
import 语句//常见的有import java.util.*;牛客网的编辑界面自带。包含JAVA容器等类
//java.lang包含了MATH,Character,String等基本操作,不需要引用。如Math.PI,Math.sqrt(),Math.pow(x,3)
/*java.io.*是输入输出语句,如有需要,需要自己在编辑界面写上,
常用到的函数是System.out.println(" ")、System.out.print()、其中,括号里可以加任何东西,
字符用单引号,字符串用双引号(保守起见拿不稳的用双引号),
int,double,float等直接写,并且用加号连接,‘+’操作会自动将它们变成字符串输出。
常用到的输入函数时System.in.read(),读入一个字符。*/
class 主类名称{
public static void main(String[] args){
//包含main函数的是主类,文件名为主类名。在牛客网的编辑界面,
//通常class名称为Solution,包含一个方法public 返回值类型 solution(参数类型 参数变量名){},
//花括号内由考试者填写方法,不需要自己写主函数啥的。
//方法体
}
}
JAVA的变量名命名原则:字母,下划线和$开头,以字母,下划线,$和数字组成的序列。区分带消协。关键字不能作为变量名。(int,final,class,public)
JAVA包括基本数据类型和类。类可继承。基础数据类型不可继承。如char是基础数据类型,Character是类。
JAVA用final声明常量:
final float PI=3.1415926;//PI也可以直接用Math.PI调用
final int max=1000;
JAVA的%也可以对浮点数运算,C/C++只能对整数运算。
3.14%2.5=0.64
JAVA的“+”号可以连接任何数据,将他们转换成字符类型
举例:int x=5;char ch='a';double d=3.14;System.out.println(“”+x+ch+d);
JAVA的break和continue:
break跳出所有嵌套循环;continue设置标号T,并通过continue T跳到标号T处,开始下一次循环。
例:
T: for(i=1;i<3;i++){
...
continue T;
...
}
2)面向对象
区分类和对象:每个对象都是唯一的,单独分配内存;对象具有属性和行为,它们之间进行消息发送;对象都属于某个类。
类的构造函数:默认构造函数无具体实现,只有空大括号{};构造函数可不写;自定义构造函数括号里要写类型;构造函数无返回值,但不用写void。
其余抽象类,类的封装,继承,多态相关知识点不赘述。
3)数组
数组的创建:int[] x = new int[5] //是方括号不是小括号( ),默认初始化为5个0,[0,0,0,0,0]
数组的初始化:int[] a = new int[]
//算法考察中一般数组是未知的,用第一种方法创建。如果一支,可以直接int[] a={1,2,3,4,5};
数组可使用的方法:x.length ,获得长度
二维数组的创建:
int[][] a=new int[5][3];
//数组必须制定长度,或者在大括号中有多少个元素 就有多长,一维数组同理。
int[][] a=new int[5][];
int a[0]=new int[2];
...
a[4]=new int[1];
//定义不等长二维数组;第二行可以不写,只初始化行就可以,列的大小,以及数组的内容可以不设置,直接用。
二维数组的长度:a.length//行 a[1].length//列
Character字符类:
char a;/Character b=new Character('a');
字符类的方法:
int compareTo(Character)比大小,返回值大于0则大,如int val=c1.compareTo(c2);
boolean f=c1.equals(c2);是否相等
//其他方法不做赘述
字符串类:
String str="China";
String类方法:
int len=str.length();
char c=str.charAt(2);//位置2处的字符,'i'
int val=s1.compareTo(s2);
boolean f=s1.equals(s2);
String str2=str1.substring(1,4)//1,2,3,位置的字符
//其他方法不做赘述
注意:字符串“a”;字符'a'。
4)JAVA容器
原因:数组大小类型不可变。
通用操作:add,remove,clear,size,iterator
注意:不能像数组一样a[i]=5;必须用a.add(5)
iterator的用法:
t=a.iterator()
t.hasNext()//是否还有元素
t.Next()//读取一个对象
集合 Set:
无序,不重复,一次输出一个样,不能按照索引访问。
HashSet a = new HashSet()
按照哈希算法找,速度快
方法:
boolean f = a.isEmpty()
boolean f = a.contains(5);//是否含有一个对象,任意类型都可以,'b',“SHE”
有重复项,则add只导入一个
列表List:
有顺序,可重复,查询快,可以根据索引查找,比起数组,有很多方法
- ArrayList
public ArrayList(int initCapacity){ }
Public void add( Object o){}//在末尾
Public void add( int index,Object o){}//在指定位置
public Object get(int index){}
Public int indexOf(object o){}//第一次出现o的位置
Public int lastIndexOf(object o){}//最后一次出现o的位置
void removeRange(int begin,int end){}
public object[] toArray(){}//变成数组
- Stack(堆栈列表)
void push(Object o)
Object pop()
int search(Object o)
boolean empty()
Object elementSt(int index)
- List可以排序:sort(List a)对list中的元素进行自然排序
映射Map:
HashMap
put(a,a-b);
get("");
System.out.print(a.get("name").toString()); //输出
2.vivo2020笔试题
1)时间安排
如果一道题是30min,那么10分钟思考思路,10分钟代码,10分钟调试。
如果思考没有结果,立马结束,不拖延时间。
2)考虑输入数据的异常输入情况
3)数组的初始化是int[] a=new int[5],而不是(5)
4)
题目一:
对于一个数组n,找到一个最小的m,使得m的每位相乘结果等于n,并输出m;如果没有输出-1。
例:100->455
思路:相乘等于一个数字,首先想到公约数。数字最小,想到位数越少数字越小,所以应该从大的开始除。每一位应该是1-9,0的话成绩为0了,所以应该从9开始。
整理成算法:从9开始,除以9有余数,那么不做处理,除以8试试;除以9没有余数,说明9是公约数,那么就对n/9做相同的处理。
应该分成n大于10和小于10两种情况。
关键代码:
return solution(n/i)*10+i;
5)
题目二:
工厂做工,第一天生产1件,之后两天每天生产2件(第2,3天),之后三天每天生产3件(第4,5,6天),问,输入一个天数m,总共生产了多少件。
例:11->35
思路:首先画图列一下天数和生产情况,可以得到每个生产情况对应着一个最大天数,只要找到 m之前的一个最大天数,就可以求解。
找之间的规律。发现2列的数字比发现1多1,由此可见,对于生产情况i来说:
- i*(i+1)/2=max_day;
- 生产总数为i*i。
算法思路:由于前面的要算在总数里,所以从小开始循环。i=1->m,计算m与max_day的关系,如果max_day小于m,那么就加上i*i;如果大于,就计算超过了几天,加上去。
关键代码:
pn=pn+i*(m-(i-1)*i) //加上之前的,并加上这次的,这次的等于这次的每日生产量i*(天数m-上一次的最大生产天数(i-1)*i)