Java刷题一些小技巧记录

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中为二进制书写方式,直接通过这种写法配合右移,可以进行数字二进制的比较

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值