文章目录
前言
这里对平时刷题用到一些 API 做一下汇总,免得忘记。
Java
类型转换:char 变量赋值给一个 int 变量,隐式转换;int 变量赋值给一个 char 变量,需要做强制类型转换(char)。
初始化
网上有资料说 “类的成员变量被初始化为默认值,而局部变量必须经过显示初始化才能使用它” 。但是对于局部变量 int[] a=new int[4];中的 a 而言,其中元素的初始值均为默认值。所以 Java 的初始化应该表述为:在堆中的变量被初始化为默认值,在栈中的变量必须经过显示初始化才能使用。
关于 List 的初始化:
1,采用 add() 方法
List<Integer> list1=new LinkedList<>();
list1.add(2);
list1.add(4);
...
2,采用双层大括号,外层的{}定义了一个 LinkedList 的匿名内部类。内层的{}的定义了一个实例初始化代码块。 这个代码块在初始化内部类时执行。所以这里相当于定义了一个匿名内部类,并使用add添加元素来初始化。
List<Integer> list1=new LinkedList<>(){{
add(2);
add(4);
}};
3,采用 Arrays.asList 方法
Integer[] value = new Integer[]{5, 9, 2, 10, 11};
List<Integer> list1=new LinkedList<>(Arrays.asList(value));
List<Integer> list2=new LinkedList<>(Arrays.asList(1,2));
输入/输出Scanner
对于常见算法题的输入处理,通常采用 Scanner 类来处理,Scanner是一个扫描器,它将键盘上的输入数据,先存到缓存区,然后从缓存区读取数据。,假设为同步阻塞I/O模型,read系统调用会从用户空间切换到内核空间,数据会先被存储内核空间缓冲区中,数据全部到达后,内核将数据从内核空间拷贝到用户空间,至此进程完成读取输入数据的操作(期间进程是处于阻塞状态的)。
一个处理键盘输入的 Scanner 类对象初始化如下:
Scanner s=new Scanner(System.in);//从标准键盘来读取输入
Scanner 对象有两个方法来处理输入:
1、 hasNextXxx() :判断是否还有下一个输入项。其中 Xxx 可以为 Int、Long、Double 等,分别判断下一个输入是否为对应的基本数据类型;而 hasnext() 判断下一个输入项是否为一个字符串。(由于 hasNextXxx() 会阻塞程序,所以一般题目中不会采用该方法。)
2、nextXxx():获取下一个输入项。其中 Xxx 可以为 Int、Long、Double 等,分别获取对应的基本数据类型值;而 next() 表示获取一个字符串。
nextXxx()(包括 next())默认情况下采用空白(空格、Tab、回车)作为多个输入项之间的分隔符。键盘输入数据会先存储到缓冲区中,然后 nextXxx() 从缓冲区中开始读取一个相应的有效字符值(如果读取到的字符非法时会产生异常),碰到空白时方法返回,对有效字符之后的空白不会读取。补充:nextXxx() 方法在读取缓冲区中数据时,对有效字符之前遇到的空白会自动跳过。 简单示例如下:
Scanner s=new Scanner(System.in);//从标准键盘来读取输入
int a,b;
a=s.nextInt();
b=s.nextInt();
System.out.println(a+" "+b);
在输入 2 3+回车 和 2 3 4 5+回车时,a 和 b 的值都为 2 和 3。据此可发现键盘输入是先被存储到缓存区中的。
nextLine() 方法获取下一行中的字符作为一个字符串返回。因为是逐行读取,所以其分隔符仅为回车(nextLine() 会在读取回车字符之后返回)。
问题:给出两行输入,第一行是一个没啥用的整数,第二行是若干个整数(用空格分隔开),需要将第一行的整数保存起来,第二行的所有值保存到一个 List 中。错误示例:
Scanner s=new Scanner(System.in);//从标准键盘来读取输入
int flag;
List<Integer> list=new LinkedList<>();
flag=s.nextInt();
String eles=s.nextLine();
String[] tmp=eles.split(" ");
for(String ss:tmp)
list.add(Integer.parseInt(ss));
正确示例:
Scanner s=new Scanner(System.in);//从标准键盘来读取输入
int flag;
List<Integer> list=new LinkedList<>();
flag=s.nextInt();
s.nextLine();//需要将 nextInt 未读取的回车符读取,不然后面的 eles 读到的就是一个空字符了
String eles=s.nextLine();
String[] tmp=eles.split(" ");
for(String ss:tmp)
list.add(Integer.parseInt(ss));
关于 next() 和 nextLine() 的补充说明。
public static void main(String[] args)
{
Scanner s=new Scanner(System.in);
String a=s.next();// 刚开始读取内容时,碰到的空白字符均被忽略,直到遇到合法字符序列,再次遇到空白字符停止读取,空白字符留还存在于输入流中(或缓冲区中)。
String b=s.next();
System.out.println(a+"---"+b);
String aa=s.nextLine(); //此时位置还停留在第一行的空白字符处,aa读取非换行字符的空白字符,直到碰到换行符,将光标置在下一行。
// 如果此时停留的空白字符为为换行符,则 aa 为空字符串,
String bb=s.nextLine();
System.out.println();
System.out.print(aa+"***"+bb);
}
字符串
不可变类String 和可变类 StringBuilder,String 对象的构造函数可以为一个 StringBuilder 对象,StringBuilder 对象的构造函数可以为一个 String 对象。
a、String 类:
以下 API 的调用者默认为字符串对象 s。
1,char charAt(int index):获取s 在 index 处的字符。index 范围:[ 0, s.length()-1]
2,int length():返回 s 的长度
3,boolean equals(Object ss):String 类重载方法判断 s 和 ss 两个字符串是否相等
4,int compareTo(String ss): 判断 s 和 ss 的大小,相等返回 0。若 ss 是 s 的一个子串且 ss!=s(特征:s 比 ss 长),返回值为正,若 s 在对应字符处大于 ss (‘z’ 最大,’A’最小),返回值也为正;其余为
5,String substring(int start,int end):求 s 在[start,end) 范围的
6,char[] toCharArray():将 s 转换为 char 数组。 char 数组转换为 String :将该数组作为 String 构造函数的参数即可
7,String[] split(String regex):将字符串 s 分割成多个字符串数组。简单示例如下:
String ss=new String("13 47 849");
String[] re=ss.split(" ");//["13", "47", "849"]
re=ss.split("4");//["13 ", "7 8", "9"]
8,静态方法 String valueOf(X x):将基本类型值转换为 String。(将基本类型和空字符串“”拼接(+)也可以起到相同的效果)
b、StringBuilder 类:
以下 API 的调用者默认为 StringBuilder 对象 sb,以下API使用时不需要考虑返回值。
1,StringBuilder append(X x):将基本类型值、char[]、String 对象、StringBuilder 对象追加在当前 sb 字符的后面
2,StringBuilder insert(int offset,X x): 将基本类型值、char[]、String 对象、StringBuilder 对象插入在当前 sb 字符 index 处
3,StringBuilder delete(int start,int end):删除 sb 中的字符序列 [ start,end)
4,StringBuilder deleteCharAt(int index):删除 sb 中位置在 index 处的字符
Math 类
以下 API 均为静态方法,x 可以为 int、long、float 和 double:
1,X abs(X x):返回 x 的绝对值
2,X max(X x1,X x2):返回 x1 和 x2 之间的最大值
2,X min(X x1,X x2):返回 x1 和 x2 之间的最小值
数组和 Arrays类
属性 length:可以访问 array 的长度。
Arrays 类中的静态方法:
1,int binarySearch(type[ ] a,type key):使用二分查找 key 元素在 a 数组中的下标(索引)。a 中不包含 key 元素,返回 -1。要求数组 a 已经升序排列。
2,type[ ] copyOf(type[ ] original,int length):复制 original 得到一个新数组,将其返回。length 为新数组的长度,如果 length < original.length,截取 original 前面 length 个元素;否则在 original 数组之后补齐 length 个元素,新补充的元素为 0、false 或 null。
3,boolean equals(type[ ] a,type[ ] b):判断数组 a 和 b 是否相等。要求长度相等且每一个位置上的元素也相等。
4,void fill(type[ ] a,type val):将数组 a 的所有元素都赋值为 val。
5,void sort(type[ ] a):对 a 中的元素进行升序排序。
6,String toString(type[ ] a):将数组 a 转化为一个字符串。每个元素采用 ", ”隔开。
集合
集合的常用 API 参考 https://blog.csdn.net/Little_ant_/article/details/121227195
随机数
Random r=new Random();
int a=r.nextInt(8);// a 为 [0,8) 之间的随机数
a=r.nextInt(2,9);// a 为 [2,9) 之间的随机数
C/C++
初始化
数组初始化
参考链接:https://blog.csdn.net/liubing8609/article/details/85319195,其中包含有字符数组(C字符串)。
C 字符串
C字符串的常用 API 在头文件<string.h>中,参照百度百科:https://baike.baidu.com/item/string.h/4262091?fr=aladdin#4 包括常用的 memset、strlen、strncpy 等函数。
STL
C++标准中,STL 被组织为下面的 13 个头文件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>、<utility>
。
vector、stack 和 queue 可参考链接:https://blog.csdn.net/qq_42653576/article/details/105373024
稍微全面一些的 STL 参考:https://blog.csdn.net/qq_42322103/article/details/99685797
总结
未完。