【小航的算法日记】Java-OJ常用API

在线OJ评测:传送门

0.基础模板:

import java.util.*;       
import java.lang.Math;
import java.io.*;

class Main{
	 public static int arr[] = new int[1000005];
	 public static void main(String[] args){
	 	Scanner sc =new Scanner(System.in);
	 	System.out.print(" " + a);
	 	System.out.printf("%d", a);
	}
}

1.常用包

import java.util.Scanner;
import java.util.Map;
import java.util.Collection;
import java.lang.Math;

2.输入输出

基础:

import java.util.Scanner; 
Scanner sc = new Scanner(System.in);
// 字符串
String s = sc.next();
String str = sc.nextLine();  // 读取一行,含空格

// 数字
int n = sc.nextInt();
while(sc.hasNext()){ // 控制台手工输入ctrl+z退出
	int a=input.nextInt();
}
System.out.printf(); // 可使用格式控制符进行格式化输出。
System.out.printf("%07d", a); 
String.format("%07d", a);
System.out.printf("%.2d", doub); 

System.out.print() //
System.out.println() // 自动换行。

Integer.toBinaryString(i) // 二进制输出

快速输入、输出:

BufferedReader

  • int read() 读取单个字符。
  • String readLine() 读取一个文本行。
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

3.字符串

str.length(); // 字符串(有括号)
nums.length; // 数组(无括号)

字符串判等

// 字符串判等,不能==
s1.equals(s2);

字符串判空

isEmpty()   <==>  length()=0

字符串遍历

char s = str.charAt(index); // 访问某个字符
str.setCharAt(int index, char ch);//将指定索引处的字符替换为ch

// 字符串转数组
char[] chars = str.toCharArray();
for(s1 : s.toCharArray()){} // 字符串遍历

字符串检索

int s =str.indexOf("文艺倾年"); // 检索字符串

字符串提取

s = str.substring(0,1);  // (,] 范围

字符串反转

str = new StringBuilder(str).reverse().toString();

字符串转化

str.toUpperCase(); // 大写
str.toLowerCase(); // 小写

int a = Integer.parseInt(str); // 字符串→数字
String s = String.valueOf(value); // Other→字符串

// valueOf()传入null返回null,而toString()报空指针异常
// copyValueOf()往往处理字符数组用
copyValueOf(char[] data): 返回指定数组中表示该字符序列的字符串。
copyValueOf(char[] data, int start, int count):返回指定数组中指定片段的字符串。
start:开始下标 count:长度

字符串拆分

String[] strs = str.split(" "); // 字符串分割

str.trim(); // 去除头尾空格

字符串比较

str1.compareTo(str2); // 字典序比较 '12'.'21'<0

字符串替换

str.replace("文艺倾年","小航"); // 字符串替换

4.数组

Arrays.fill(nums, 0); // 填充数组为0

Arrays.sort(nums); // 升序

// 数组拷贝
numsA.clone(numsB);  // 把numsB的值拷贝给numsA
Arrays.copyOf(int[] a, int length);//从a数组的第一个元素开始复制,复制length个元素。
Arrays.copyOfRange(int[] a, int begin, int to);//从a数组begin开始复制,到to-1位置结束。

// 转数组
list.stream().filter(integer -> inter != null).mapToInt(i -> i).toArray();
set.stream().filter(integer -> inter != null).mapToInt(i -> i).toArray();
int[][] res = list.toArray(new int[0][0]);

// 数组转list
List<Integer> list = new ArrayList<>(Arrays.asList(arrays));
List<Integer> list = Arrays.stream(arrays).collect(Collectors.toList());
List<Integer> list = CollectionUtils.arrayToList(arrays);

// 数组求和
for (int element : array) sum += element;
int sum = Arrays.stream(arrays).sum();
int sum = IntStream.of(array).sum();

// 数组求最值
int maxNum = Arrays.stream(arrays).max().getAsInt();
int maxNum = Collections.max(Arrays.asList(arrays));

int maxNum = Arrays.stream(arrays).min().getAsInt();
int maxNum = Collections.min(Arrays.asList(arrays));

5.ArrayList

Collections.fill(list,0); // 填充数组为0

// 增删查改
list.add(1);
list.add(3,4); // 将4插入到第三个位置
list.remove(3); // 删除下标为3的
list.set(1, 2); // 将1下标的元素改为2
list.get(1);

Collections.sort(list); // 排序
Collections.max(list); // 最大值
Collections.min(list);
Collections.shuffle(list);  //list洗牌

Collections.reverse(list); // 翻转

list.toArray() // list变数组

list.isEmpty() //list是否为空
list.clear(); //移除所有元素。

list.size(); 

6.Map

6.1HashMao

map.put(key, value);  // 插入

// 查找
if(map.containsKey(k));
if(map.containsvalue(v));

int value = map.get(k); // 取值

map.clear(); // 清空
map.remove(key); // 移除指定键的映射关系

// 遍历
Iterator<Integer> it = map.keySet().iterator();
while(it.hasNext()){
	Integer key=it.next();
	Integer value=map.get(key);
}

// 提取其中所有key
for(Integer key : map.keySet()){
	...
}

// 提取所有value
for(String value : map.values()){
	...
}

// 计数统计
// 如果map存在num,原来的value + 1
// 如果map不存在num,设置value = 1
map.put(num, map.getOrDefault(num, 0) + 1);

// 合并
map.merge(num, 1, Integer::sum);
map.put(num, map.getOrDefault(num, 0) + 1);
// 合并两者
map.merge(num, 1, (old, new) -> old + new)
// 保留旧值
map.merge(num, 1, (old, new) -> old)
// 覆盖旧值
map.merge(num, 1, (old, new) -> new)
// 删除旧值
map.merge(num, 1, (old, new) -> null)

6.2TreeMap

TreeMap是基于红黑树实现的,是有序的

tree.firstKey(); // 第一个(最低)键。
tree.lastKey(); // 最后一个(最高)键

7.Set

7.1HashSet

set.add(a); // 插入
set.remove(b); // 删除
set.contains(a); // 查询
set.remove(a); // 移除
set.clear(); // 清除

7.2TreeSet

tree.first(); //返回第一个元素
tree.last(); //返回最后一个元素

tree.higher(E e) // 返回严格大于给定元素的最小元素,不存在返回null
tree.lower(E e) // 返回严格小于给定元素的最大元素,不存在返回null

8.LInkedList

LinkedList<Pet> pets = new LinkedList<Pet>(Pet.arrayList(5));//生成五个Pet对象

// 取第一个
pets.getFirst() // 列表为空返回NoSuchElement-Exception
pets.element() // 列表为空返回NoSuchElement-Exception
pets.peek() // 列表为空返回null

// 移除第一个,并返回列表头
pets.removeFirst() // 列表为空返回NoSuchElement-Exception
pets.remove() // 列表为空返回NoSuchElement-Exception
pets.poll() // 列表为空返回null

pets.addFirst(new Rat()); // 插入头部

// 插入尾部
pets.addLast(new Rat()); 
pets.add(new Rat()); 
pets.offer(new Rat()); 

pets.set(2,new Rat());//将替换为指定的元素

9.PriorityQueue

默认小顶堆

// 默认初始容量为11
PriorityQueue<Integer> Q = new PriorityQueue<>(); // 初始化

add(E e)//将指定的元素插入此优先级队列。
offer(E e) // 将指定元素插入此优先队列

poll() // 获取并移除第一个
remove(Object o) // 移除指定元素

clear()//清空

peek() // 获取第一个元素,及最小或最大元素

contains(Object o) // 如果包含指定元素返回true
iterator()//返回在此队列中的元素上进行迭代的迭代器。

size() // 返回元素个数

9.Calendar

它的构造方法被protected修饰,所以无法直接创建该对象。
常用字段:
时间单位字段:

字段解释
YEAR
MONTH
DATE / DAY_OF_MONTH
HOUR_OF_DAY
MINUTE
SECOND/MILLISECOND秒/毫秒
DAY_OF_WEEK周几
DAY_OF_YEAR一年的第多少天
WEEK_OF_YEAR一年的第多少周
WEEK_OF_MONTH日历式的第几周
DAY_OF_WEEK_IN_MONTH某月中第几周
public class CalendarDemo {
	public static void main(String[] args) {
		// 其日历字段已由当前日期和时间初始化:
		Calendar rightNow = Calendar.getInstance(); // 子类对象
		// 获取年
		int year = rightNow.get(Calendar.YEAR);
		// 获取月
		int month = rightNow.get(Calendar.MONTH);
		// 获取日
		int date = rightNow.get(Calendar.DATE);
		//获取几点
		int hour=rightNow.get(Calendar.HOUR_OF_DAY);
		//获取上午下午
		int moa=rightNow.get(Calendar.AM_PM);
		if(moa==1)
			System.out.println("下午");
		else
			System.out.println("上午");
 
		System.out.println(year + "年" + (month + 1) + "月" + date + "日"+hour+"时");
		rightNow.add(Calendar.YEAR,5);
		rightNow.add(Calendar.DATE, -10);
		int year1 = rightNow.get(Calendar.YEAR);
		int date1 = rightNow.get(Calendar.DATE);
		System.out.println(year1 + "年" + (month + 1) + "月" + date1 + "日"+hour+"时");
	}
}

10.自定义比较器

10.1数组排序 Arrays.sort()

Arrays.sort(arr, new Comparator<Integer>() { // arr是数组名,<>中是待排序集合所包含的数据类型
	public int compare(int a, int b){  // 待排序集合中的元素是什么数据类型,这里的两个函数参数就定义为什么数据类型
		 return a - b;   升序
		// return b - a;   降序
		// a - b > 0 交换ab位置,反之不变, 即返回值为正数时,交换数组中正在比较的
		//两个元素的位置,返回值为负数时,不交换。 
		}
	})

10.2集合排序 Collections.sort()

TreeSet<Integer> s = new TreeSet<>(new Comparator<Integer>(){
			public int compare(Integer a, Integer b) {  
	        	return b - a; 
			}
		});

10.3自定义数组对象排序

法一:

//对pair类实现Comparable接口后,直接调用sort函数排序就行了。
static class pair implements Comparable<pair>{
        int a, b, w;
        pair(int u, int v, int x){
            a = u;
            b = v;
            w = x;
        }
        public int compareTo(pair p) {
    		return this.w - p.w;
    	}
}

法二:

Arrays.sort(s, new Comparator<student>() {
		public int compare(student a, student b) {  //
	        return a.age - b.age; // 按照年龄大小升序排列
		}
});
BNUEP Offline Judge 北京师范大学珠海分校离线评测系统是在具备题目测试数据的情况下,能无联网自动评测ACM/ICPC模式的源代码评测系统(即本地测试工具、评测机)。它主要有以下功能(所有的功能都无需联网,在本机即可实现): *评测核心功能: 基本具备Online Judge的判题核心功能,如编译代码、内存限定,时间限定,获取代码长度等; *支持多种语言: 1.0 Beta2版本支持C/C++、Pascal、C#、JAVA; *出题模式 可以在有标准输入数据和标准程序的情况下,由系统产生标准输出数据,并可批量保存,同时自动命名标准输出数据的后缀; *文本高亮对比 在判题后,可以直接在本系统中将自己的程序输出和标准输出进行高亮的文本差异对比,操作类似于一些文本对比软件,在一定程度上可以较方便地发现WA代码的出错细节; *支持不限时执行代码 这个功能可以在一定程度上检测TLE代码的算法是否正确的,当然,不能是跑一天都没跑出来的程序; *打包与加密测试数据 使用加密后的数据可以正常判题,但不显示标准输出。这个功能是为了弥补放出去给别人评测的测试数据是明文的缺陷。加密之后评测方就看不到测试数据。这样就既可以实现离线评测,又可以实现Online Judge上的对测试数据屏蔽; ACM-ICPC简介: ACM国际大学生程序设计竞赛(简称ACM-ICPC)是由国际计算机界具有悠久历史的权威性组织ACM学会(Association for Computing Machinery)主办,是世界上公认的规模最大、水平最高、参与人数最多的大学生程序设计竞赛,其宗旨是使大学生能通过计算机充分展示自己分析问题和解决问题的能力。 ACM-ICPC的每一道题,都具备题目、需求描述、输入格式描述、输出格式描述、样例输入和样例输出共六大信息,有些题目还有一定的提示。此外,裁判还额外存储了关于该题的一组或多组对选手屏蔽的标准输入和标准输出数据,这些测试数据已经经过验证符合题意要求。当用户提交一道题目的源码之后,裁判会将该源码放入评测系统中编译运行,并使用标准输入作为用户程序的输入,然后获取用户程序的输出,接着,将用户程序输出和标准输出比较,最后返回给用户一个评判结果。评判结果包括:Accepted(测试通过)、Compile Error(编译失败)、Memory Limit Exceed(内存超出限制)、Presentation Error(格式错误)、Runtime Error(运行时错误,可能是数组越界,改写只读的内存,除零,栈或堆溢出等错误)、Time Limit Exceed(时间超出限制)、Wrong Answer(答案错误)等。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值