刷题常用API


前言

      这里对平时刷题用到一些 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


总结

      未完。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值