蓝桥杯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
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
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();// 返回头,队列空返回nullq.size();// 返回元素个数
q.isEmpty();// 队列是否为空
Priority Queue 优先队列
//优先队列 弹出最左边数
PriorityQueue<ListNode> queue = new PriorityQueue<>(new Comparator<ListNode>() {//比较器 升序@Overridepublic int compare(ListNode o1, ListNode o2) {return o1.val-o2.val;}
});
排序
Arrays.Sort();// Integer[] int不支持 但支持char int[][]
Collections.sort();// listArrays.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^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) // 判断是否超界
简单算法实现
// 欧几里得算法 算最大公约数
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转StringDouble.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;elsereturn 0;}@Overridepublic 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;}@Overridepublic String toString() {return "Student{" +"age=" + age +", name='" + name + '\'' +'}';}
}//学生比较器
class StudentComparator implements Comparator<Student>{//重写compare方法@Overridepublic int compare(Student student, Student student1) {if (student.age-student1.age>0)return 1;if (student.age-student1.age<0)return -1;elsereturn 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);
感谢大家的观看!!!创作不易,如果觉得我写的好的话麻烦点点赞👍支持一下,谢谢!!!