蓝桥杯JAVA组 推荐输入输出及示例
// 基础输入
import java.util.*;
public class Main{
public static void main(String[] args){
}
}
// 非静态方法调用
new Main.Solution();//static函数里面调用非static函数 类.函数
// 更快的输入方式 BufferedReader
// 更快的输出方式 PrintWriter+BufferWriter 并且很方便,使用方法和System.out一致
// 注意扔异常
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class Main {
static boolean[] v;
static int[] ns;
static int[] bs;
static int N;
static PrintWriter out;
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
N = Integer.parseInt(bf.readLine());
bs = new int[N + 1];
v = new boolean[N + 1];
dfs(1);
out.flush();
}
private static void dfs(int x) {
if (x > N) {
for (int i = 1; i <= N; i++) {
out.printf("%5d", bs[i]);
}
out.println();
return;
}
for (int i = 1; i <= N; i++) {
if (v[i])
continue;
v[i] = true;
bs[x] = i;
dfs(x + 1);
v[i] = false;
}
}
}
输入
Scanner sc = new Scanner(System.in);
sc.hasNext();
sc.next();
sc.nextInt();
sc.nextLine();
// 快速输入
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
bf.readLine();
bf.read();// 读取单个字符 返回int
输出
System.out.println();
StringBuilder sb = new StringBuilder();
StringJoiner sj = new StringJoiner(" ");
// 快速输出
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
out.print(a);
out.println();
out.printf();
out.flush();
基本量范围
int -2的31次方(-2147483648 2*10^9),2的31次方减一(2147483647)
15! = 1.3*10^12
Scanner
scan.hasNext();
...hasNextInt();
...hasNextLine();
...next();
...nextInt;
...nextLine();
保留小数位数的方法
double res = 0d;
new DecimalFormat("0.00").format(res);
System.out.printf("%.3f",res);
输出控制符和对应的数据类型
Random
Random r=new Random();
r.nextInt(a);//[0,a)
数组
new int[0][]//空数组
int[] arr4 = arr.clone();// 数组的复制
System
System.arraycopy(original, i, ans[i / n], 0, n);// 数组复制
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
代码解释:
Object src : 原数组
int srcPos : 从元数据的起始位置开始
Object dest : 目标数组
int destPos : 目标数组的开始起始位置
int length : 要copy的数组的长度
Arrays
Arrays.sort();// 排序
Arrays.copyOfRange(intersection, 0, index);// 返回复制的数组
Arrays.asList(nums);// 数组转List
System.arraycopy(original, i, ans[i / n], 0, n);// 数组复制 原数组 元数据的起始位置 目标数组 目标数组的开始起始位置 要copy的数组的长度
LinkedList
list.offerLast(key);// 加入到最后
remove(int index);// 移除此列表中指定位置处的元素。
remove(Objec o);// 从此列表中移除首次出现的指定元素(如果存在)。
HashMap
Map<Character,Character> map=new HashMap(){
{
put(')','(');
put(']','[');
put('}','{');
}
};//初始化实例
map.get(key);
map.put(key,num);
map.containsKey(key);
map.getOrDefault(key,0);
map.remove(key);
for(Map.Entry<String,Object> arg:map.entrySet()){
arg.getKey() + arg.getValue();
}// 获取键值对
map.keyset();//返回key的String[]集合 常用于循环
map.values();// 返回map的values集合
Object[] a = map.keySet().toArray();
Arrays.sort(a);
HashSet
set.add();
set.remove();
set.size();
set.clear();
set.toArrays(); // hashset转数组
String
s.trim();//去除前后空格
s.substring(start, start + maxLen)//左闭右开
s.indexOf(ss);//ss可以是整数也可以是字符串 返回指定字符串第一次出现的索引 没有则返回-1也可以从fromIndex开始位置
s.indexOf(ss,fromIndex);
String[] ss = s.split(" ");//字符串按照空格分开
String.valueOf();//其他转成String
String.contains("x");//是否包含
s1.compareTo(s2);//比较两个字符大小,可用于字典序
int a = Integer.parseInt("-1");//string转int
String[] ss = s.split(" ");// 字符串按照空格分开
s.split("[- :]");// 使用- :三个字符进行分割工作
String.valueOf();// 其他转成String
String.contains("x");// 是否包含
String.format("%.2f",x);// 保留2位小数
s.toUpperCase();// 全部转大写
s.toLowerCase();// 全部转小写
s.replace(" ","");// 替换
StringBuilder
StringBuilder sb=new StringBuilder();
sb.append('(');
sb.deleteCharAt(cur.length()-1);
sb.delete(l,r);
sb.insert(pos,string);
sb.toString();//转换成String
new StringBuilder(s).reverse().toString();//字符串反转
StringJoiner
算法题好用并且快
// 每个元素通过 "." 分割,并且用 "[" 和 "]" 包住前后
StringJoiner joiner2 = new StringJoiner(".", "[", "]");
// 元素用" "分割
StringJoiner joiner = new StringJoiner(" ");
// 将joner和joner2的元素合并,并且每个元素通过 "." 分割,并且用 "[" 和 "]" 包住前后
joiner2.merge(joiner);
// 新增代码 类似StringBuilder
joiner.add(node.val + "");
System.err.println(joiner);
ArrayList
List<List<Integer>> ans = new ArrayList<List<Integer>>();// 两个List的初始化方式
ans.add(new ArrayList<Integer>(t));//List<Integer> t = new ArrayList<Integer>();
List<Integer> list = new ArrayList();
list.add(i,o) // 向list i 位置插入
list.toArray(new int[list.size()][]);// list转数组
Collections.swap(output, first, i);// 把List两个位置的元素调换
Collections.sort(l1,(a,b)->a.compareTo(b));
Collections.sort(l2,(a,b)->a.compareTo(b));
Deque 栈 双端队列
Deque<Integer> d =new LinkedList();
d.isEmpty();
// 队列
d.add(e);
d.remove();
d.offer(e);
d.poll();
d.element();
d.peek();
// 栈
d.peek();
d.pop();
d.push();
Queue 队列
Queue<String> q = new LinkedList();
q.add(); // 插入队列尾部,队列满抛异常
q.remove();// 移除头返回头,队列空抛异常
q.element();// 返回头,队列空抛异常
q.offer();// 插入队列尾部,队列满返回false
q.poll();// 移除头返回头,队列空返回null
q.peek();// 返回头,队列空返回null
q.size();// 返回元素个数
q.isEmpty();// 队列是否为空
Priority Queue 优先队列
//优先队列 弹出最左边数
PriorityQueue<ListNode> queue = new PriorityQueue<>(new Comparator<ListNode>() {//比较器 升序
@Override
public int compare(ListNode o1, ListNode o2) {
return o1.val-o2.val;
}
});
排序
Arrays.Sort();// Integer[] int不支持 但支持char int[][]
Collections.sort();// list
Arrays.sort(a, 0, n);// 排序int[]
Arrays.sort(b,Collections.reverseOrder());// 降序
Collections.sort(l, Collections.reverseOrder());
位运算
(~x) = -(x + 1)// 取反 所有位置0变1,1变0
a^a = 0; // 相同数 异或 =0 同0异1
0^a = a;
n & (n - 1); // 最低位1改为0
n & (-n); // 获取最低位1
1 << n; // 2^n
if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) // 判断是否超界
a^(n-1)%n = 1;// 检验两个数是否互质
t&1 = 1;// 检验第一位是不是1
简单算法实现
// 欧几里得算法 算最大公约数
public static int gcd(int a, int b) {
return a % b == 0 ? b : gcd(b, a % b);
}
包装类
Integer.valueOf(s);// String转Integer
Integer.toString(n);// Integer转String
Double.compare(a,b);// 比较double大小
Iterator 迭代器
用于迭代 ArrayList 和 HashSet 等集合。
Iterator<String> it = sites.iterator();
it.next();
it.hasNext() ;
it.remove();
Math
Math.round() ;// 四舍五入
Math.cos(Math.PI);// 180度的余弦值
Math.random(int l,int r);
Math.log(a);// ln(a)
Math.ceil();// 向上取整
Math.floor();// 向下取整
Math.round();// 四舍五入
Math.round(11.5)=12;Math.round(-11.5)=-11;
// 注意java的除法默认去除小数部分
Comparator && Comparable 比较器
public interface Comparable<T> {
public int compareTo(T o);
}
public interface Comparator<T> {
public int compare(T lhs, T rhs);
}
class Students implements Comparable<Students>{
int age;
String name;
Students(int age,String name){
this.age=age; this.name=name;
}
@Override
//重写compareTo方法按Students的年龄排序
public int compareTo(Students o) {
if (this.age-o.age>0)
return 1;
if (this.age-o.age<0)
return -1;
else
return 0;
}
@Override
public String toString() {
return "Students{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
public class TsetCompareable {
public static void main(String args[]){
List<Students> list =new ArrayList();
list.add(new Students(10,"zhangsan"));
list.add(new Students(18,"lisi"));
list.add(new Students(9,"wangwu"));
Collections.sort(list);
System.out.println(list);
}
}
class Student {
int age;
String name;
Student(int age,String name){
this.age=age; this.name=name;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
}
//学生比较器
class StudentComparator implements Comparator<Student>{
//重写compare方法
@Override
public int compare(Student student, Student student1) {
if (student.age-student1.age>0)
return 1;
if (student.age-student1.age<0)
return -1;
else
return 0;
}
}
public class ComparatorTest{
public static void main(String args[]){
List<Student> list =new ArrayList();
list.add(new Student(10,"zhangsan"));
list.add(new Student(18,"lisi"));
list.add(new Student(9,"wangwu"));
Collections.sort(list,new StudentComparator());
System.out.println(list);
}
}
BigInteger 超大数
b.toString().equals("0") // 比较
b.mod(b) // 取余
b.add(b) // 相加
b = new BigInteger("1"); // 初始化
运算符优先级
优先级 | 符号 |
---|---|
1 | [] () |
2 | ++ – ~ ! (数据类型) |
3 | * / % |
4 | + - |
5 | << >> >>> |
6 | > <= >= |
7 | == != |
8 | & |
9 | ^ |
10 | | |
Data
// 毫秒转时间
long mills = scan.nextLong();
Date date = new Date(mills);
SimpleDateFormat ft = new SimpleDateFormat ("HH:mm:ss");
System.out.println(ft.format(date));
scan.close();
Date 有时区
LocalDateTime 自带系统时区
CountDownLatch
//countDownLatch 一个线程(或者多个), 等待另外N个线程完成某个事情之后才能执行。
CountDownLatch(int count):count为计数器的初始值(一般需要多少个线程执行,count就设为几)。
countDown(): 每调用一次计数器值-1,直到count被减为0,代表所有线程全部执行完毕。
getCount():获取当前计数器的值。
await(): 等待计数器变为0,即等待所有异步线程执行完毕。
boolean await(long timeout, TimeUnit unit): 此方法与await()区别:
此方法至多会等待指定的时间,超时后会自动唤醒,若 timeout 小于等于零,则不会等待
boolean 类型返回值:若计数器变为零了,则返回 true;若指定的等待时间过去了,则返回 false
Time 定时器
public static void main(String[] args) {
//testTimer1();
//testTimer2();
testTimer3();
//testTimer4();
}
//方法一:设定指定任务task在指定时间time执行 schedule(TimerTask task, Date time)
public static void testTimer1() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, 3500);
// 设定指定的时间time为3500毫秒
}
/**
* 方法二:设定指定任务task在指定延迟delay后间隔指定时间peroid执行
* schedule(TimerTask task, long delay, long period)
* */
public static void testTimer2() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, 2000, 3500);
}
/**
* 方法三:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。
* scheduleAtFixedRate(TimerTask task, long delay, long period)
* */
public static void testTimer3() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, 1000, 2000);
}
/**
* 方法四:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行.
* Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
* */
public static void testTimer4() {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制小时
calendar.set(Calendar.MINUTE, 0); // 控制分钟
calendar.set(Calendar.SECOND, 0); // 控制秒
Date time = calendar.getTime(); //获取当前系统时间
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
}
// 程序暂停
Thread.sleep(time);
感谢大家的观看!!!创作不易,如果觉得我写的好的话麻烦点点赞👍支持一下,谢谢!!!