编程题常用技巧或细节

1.当用一个list作操作,然后一个List<List<Integer>> res 将这个list的内容添加进去,但是之后这个list还要变,(List存放的是引用,如果list变了,那么res里的元素也变了)该怎么办呢? 

解决办法当然不是新生成一个list2,循环让其元素等于list,这也太麻烦了;而是res.add(new ArrayLIst<Integer>(list)),这应          该是深拷贝吧

2.Arrays.sort(a);  给数组排序

   Collection.sort(b); 给list排序

 

   Arrays几个排序方法:

   Arrays.sort(基本数据类型数组):从小到大排序         为串行排序

  Arrays.sort(基本类型数组,fromindex,toindex);toindex不被包括,所以要取nums.length

  Arrays.sort(引用类型数组,new Comparator<T>(){ }):给引用类型排序,自定义比较器,所以可以实现根据任意属性排序,从小到大或从大到小排序(基本数据类型是不行的)

  Arrays.sort(引用类型数组,fromindex,toindex,new Comparator<T>(){ })

 

  Arrays.parallerSort()     java8新增的并行排序算法,基于fork/join框架。

  Arrays只有这几种排序方法,没有其他类型的  例如Arrays.sort(int[] nums,Collections.reverseOrder());这个是不存在的,不能将基本数据类型数组降序

 

   Arrays.sort()还能指定排序顺序:

   如

int [][]work=new int[m][2];
//二维数组可以看成多个一维数组组成
Arrays.sort(work,new Comparator<int[]>(){//按工作难度来排序
                @Override
                public int compare(int[] num1,int []num2){
                    return num1[0]-num2[0];
                }
            });

牛客例题

或者

 Arrays.sort(works, Comparator.comparingInt(a -> a[0]));

或者是编写一个类Work,两个属性,一个是difficuilt,一个是salary,然后建立一个一维的Work数组,再用Arrays依据salary对Work数组排序
 

collection.sort(集合),要求集合的内容类必须实现Comparable接口,重写compareto方法。

3.只要是排过序的顺序存储结构(当然包括数组),都可以通过二分法提高查找速度

4.map的几个函数:

   map.floorKey( )  :Returns the greatest key less than or equal to the given key, or null if there is no such key.

   map.floorEntry():Returns a key-value mapping associated with the least key in this map, or null if the map is empty.

   map.getOrDefalut(Object key,         defaultvalue):如果有key对应值,就返回对应值;如果没有就返回defalltvalue;

5.Arrays.asList()     不建议基本类型数组使用  详见Java Arrays.asList注意事项

Integer[] datas = new Integer[]{1,2,3,4,5};

ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(datas));

技巧:

1.编程题要善用三目运算符,可以减少if的编写,特别是有多个if时会很好的替代(动态规划题判断是否已经算过时就可以使用)

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值