Java刷题技巧:
Arrays.sort(),如果传入 cmp进行比较的时候,要将数组弄成包装类
int[] ints = set1.stream().mapToInt(i -> i).toArray();
**List a[] = new ArrayList[9];**集合类数组创建方法
==========================================================
首先对set1进行顺序流操作,mapToInt()在执行具有其长度的映射字符串的操作后返回IntStream。然后对于intStream进行toArray();即可得到int型数组。
==========================================================
转义符的使用:
其中".“对应如下: 在java中函数split(”.“)必须是是split(”\.“)。
其中”“对应如下: 在java中函数split(”“)必须是是split(”\\")。
==========================================================
③: if(!set.add(i)) return false;
set容器在添加时会返回成功与否,这点可以用以判断某些数是否重复;
==========================================================
④:Arrays.copyOf(int[] nums,nums.length);
在Java当中数组是引用传递的,想要实现值传递,则可以使用该函数进行赋值。
Arrays.toString(int[] num);
可以快速打印数组
Arrays.sort(ranges, (a1, a2) -> a1[0] - a2[0]);
对于二维数组按照首个元素从小到大进行排序。
==========================================================
⑤:枚举对象书写的时候要用逗号进行间隔
==========================================================
⑥JAVA精确到小数点后面两位
java.text.DecimalFormat df = new java.text.DecimalFormat("#.##");
double d = 3.14159;
System.out.println(df.format(d));
==========================================================
⑦Arrays.sort方法提点
默认升序
使用降序:Arrays.sort(scores,Collections.reverseOrder());降序
需要注意的是 不能使用基本类型(int,double, char),如果是int型需要改成Integer,float要改成Float,这是对于数组定义Integer[]来看的。
而且利用Compatator则便也需要姜数组定义成为大类型,小类型是无法运行的。
==========================================================
⑦HashSet容器方法提点
升序排列
正常来说我们无法取到头部或者尾部的值,这时我们便需要使用
set1.toArray()[0].要对其类型进行大类的强转。
==========================================================
⑧如何利用List<int[]>转换成为int[][]
List<int[]> res = new ArrayList<>();
return res.toArray(new int[res.size()][]);
==========================================================
⑨二进制类问题方法提点
对于某些进制类的问题,我们可以利用bit位来进行解决。
1、如leetcode中的手表二进制问题每一个灯亮,就代表着一个bit位置;
2、那么不难对时间进行遍历,0-11小时,0-59分钟都可以很好地用bit中1的个数来表述;
==========================================================
//java中通过Integer类的方法来对bit位进行统计
Integer.bitCount(h) + Integer.bitCount(m) == turnedOn
==========================================================
//C++中如是来表示
__builtin_popcount(h) + __builtin_popcount(m) == turnedOn
⑩Scanner扫描器问题
nextInt(),有时需要利用一nextLine();来处理掉\r,但是可以后续内容不适用nextLine,可以利用next即可。
1.我们读入的所有数据都是先存入缓冲区
2.Scanner实际上是从缓冲区读入以空格,\t,\n,\r分隔的字符
3.缓冲区读入了第一个整数之后,留下了\r,而\n是next()的分隔符,所以就相当于是我们循环的第一个nextline()被浪费掉了
//java里面的循环读取
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String a;
while (scan.hasNextLine()) {
a = scan.nextLine();
System.out.println(a);
}
}
==========================================================
十一、
输入输出流问题:
我们对于输入输出流,常常用到两个类
FileReader----BufferedReader 来进行封装----调用其readline()方法;
FileWriter----BufferedWriter 来进行封装。
==========================================================
十二、回溯需要返回集合时
这里需要非常注意引用类型的使用,并且,我们在返回集合的时候最好用如下操作可以建立一个新的地址:
res.add(new ArrayList<>(dq));
==========================================================
十三、比较器规则
比较器的规则是两个数相比,大于零,那么这两个数进行交换;==========================================================
==========================================================
十四、优先队列
PriorityQueue<Integer> l = new PriorityQueue<>((a,b)->b-a); //大根堆
PriorityQueue<Integer> r = new PriorityQueue<>((a,b)->a-b); //小根堆
PriorityQueue<Integer> minQueue = new PriorityQueue<>(Comparator.naturalOrder()); //自然排序小根堆
PriorityQueue<Integer> maxQueue = new PriorityQueue<>(Comparator.reverseOrder()); //反向排序大根堆
优先队列当中支持直接移除相应对象
自定义类型的话要实现外部接口
注意compare内部的参数类型必须是包装类
PriorityQueue<int[]> pq = new PriorityQueue<>(k, (o1, o2)->{
return nums1[o1[0]] + nums2[o1[1]] - nums1[o2[0]] - nums2[o2[1]];
}); //优先队列限制k大小 ,按照数组内容对比进行排序
//自定义比较类,先比较长,长升序排列,若长相等再比较宽,宽降序
static Comparator<Node> cNode=new Comparator<Node>() {
public int compare(Node o1, Node o2) {
if(o1.chang!=o2.chang)
return o1.chang-o2.chang;
else
return o2.kuan-o1.kuan;
}
};
//正则Arrays.osrt书写方式
Arrays.sort(words, (o1, o2) -> {
if (o1.length() == o2.length()) {
return o1.compareTo(o2);
} else {
return Integer.compare(o2.length(), o1.length());
}
});
==========================================================
十六、获取数组中最大值的简单写法
int minNum = Arrays.stream(nums).min().getAsInt();
==========================================================
十七、其中自定义类型的放入容器当中进行比较的过程
要重写两个方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof node)) return false;
node node = (node) o;
if (z1 != node.z1) return false;
return z2 == node.z2;
}
@Override
public int hashCode() {
int result = z1;
result = 31 * result + z2;
return result;
}
十八、treeMap的上下界限key值搜索方法
Integer prev = calendar.floorKey(start), //返回小于或等于键值的最大值
next = calendar.ceilingKey(start);//返回大约或等于给定键值的最小值
两种方法的实现
//获取值小于等于k的最大值
public static int downK(int[] a, int k){
int l = 0;
int r = a.length - 1;
//标注1: 这里是l<r,
while(l < r){
//标注2: 这样的操作是为了取高位
int mid = (l + r + 1) / 2;
if(a[mid] <= k) { //标注3:因为a[mid]<=k,所以a[mid]可能=k,所以mid坐标也满足条件,l = mid而不是mid+1;
l = mid;
}else{
r= mid - 1; //这是a[mid] > k的时候。
}
}
//标注4: 因为此时求得到的是最接近于目标值k的数,
// 如果最小值都大于k的话,那么就没有办法得到了,所以就进行一个判断
if(a[l] > k) return -1;
//标注5: 其实这里无论返回 a[l] 还是a[r]都行,循环的退出时间是l == r 的时候
return a[l];
}
//大于等于K的最小值
public static int uperK(int[] a, int key){
while (low < high) {
//这里进行的是取低位, 也是为了使得循环可以正确退出,防止死循环
int mid = (low + high)/2;
if (a[mid] < key) {
low = mid +1;
} else { //a[mid] >= key
high = mid; //因为mid也满足情况
}
}
//这里进行检查的原因参考上面的标注
if (a[high] >= key) {
return a[high];
} else {
return -1;
}
}
十八、treeSet的排序需要在new对象时就直接将比较器放入
TreeSet<Integer> s1=new TreeSet<>(cmp);
十九、数据范围如果太大,采用全新的entry方式进行记忆化搜索
Set<Map.Entry<Integer, Integer>> visited = new HashSet<>(); //建立搜索过的情况
二十、0bxxx在java中为二进制书写方式,直接通过这种写法配合右移,可以进行数字二进制的比较
二十、0bxxx在java中为二进制书写方式,直接通过这种写法配合右移,可以进行数字二进制的比较