当前位置:   article > 正文

Java刷力扣技巧总结-思想与技巧_力扣怎么刷java题

力扣怎么刷java题

Java刷题技巧

Java输入输出问题

Scanner sc=new Scanner(System.in);

输入一行字符串:sc.nextLine()

输入一个基本类型:sc.nextInt、nextLong、nextDouble

输入一个字符:scanner.next().charAt(0);

输出

System.out.printf("%d",value);

力扣刷题常见的特殊情况

1,常见的&操作便捷的含义

n&(-n)表示去lowbits,取二进制最低位,树形数组中应用。

n&(n-1)表示将二进制最低位进行取反

2,常见的list转换成[]int、[]String方法

list-->[]int:list.stream().mapToInt(Integer::valueOf).toArray();

list-->[]String:list.toArray(new String[0]);

3,list转换成[][]int方法

ArrayList<int []> res=new ArrayList<>();

res.toArray(new int [0][]);

4,堆数据结构

PriorityQueue<Integer> q=new PriorityQueue<>(new Comparator<Integer>(

int compare(Integer o1,Integer o2) {return 0;}

));

5.Java中Long转换成int

(int)Long,可能出现溢出,且java不支持。

Long.intValue(),Long对象中包含此转换方法。

Integer.parseInt(String.valueOf(long)),先转成字符串,在转成int。

6、快速幂

思想:

  1. 88 * 0110 0011(2) = 88 * 0 * 2^7 
  2.                   + 88 * 1 * 2^6 
  3.                   + 88 * 1 * 2^5 
  4.                   + 88 * 0 * 2^4 
  5.                   + 88 * 0 * 2^3 
  6.                   + 88 * 0 * 2^2 
  7.                   + 88 * 1 * 2^1
  8.                   + 88 * 1 * 2^0
  9. 代码:
  10. int quickMulti(int A, int B) {
  11.     int ans = 0;
  12.     for ( ; B; B >>= 1) {
  13.         if (B & 1) {
  14.             ans += A;
  15.         }
  16.         A <<= 1;
  17.     }
  18.     return ans;

7、摩尔投票法

应用:找出数组中出现次数超过一半的数

具体步骤:相同的数,则保留记录,不同的数则删除,,直到末尾。

8、树状数组

应用:求逆序数

  1. class BIT{
  2. int []tree;
  3. int n;
  4. public BIT(int n){
  5. tree=new int[n+1];
  6. this.n=n;
  7. }
  8. public int lowbit(int n){
  9. return (n)&(-n);
  10. }
  11. public int query(int index){
  12. int res=0;
  13. while(index!=0){
  14. res+=tree[index];
  15. index-=lowbit(index);
  16. }
  17. return res;
  18. }
  19. public void add(int index){
  20. while(index<=n){
  21. tree[index]++;
  22. index-=tree[index];
  23. }
  24. }
  25. }

9、质数的判断方法

1,常见方法,直接通过遍历到n的开平法进行整除判断,效率不高。

2,通过标志方法,设置一个bool数组,先进行初始化,奇数设置为true,偶数设置为false,只需将前面为true表示为质数的倍数设置为flase即可,效率较上面高。

3,质数分布的规律:大于等于5的质数一定和6的倍数相邻。例如5和7,11和13,17和19等等;

  1. bool isPrime( int num )
  2. {
  3.     //两个较小数另外处理
  4.     if(num == 2||num == 3 )
  5.         return 1;
  6.     //不在6的倍数两侧的一定不是质数
  7.     if(num % 6 != 1&&num % 6 != 5)
  8.         return 0;
  9.     int tmp = sqrt(num);
  10.     //6的倍数两侧的也可能不是质数
  11.     for(int i = 5;i <= tmp;i += 6)
  12.         if(num %i == 0||num % (i+ 2) == 0)
  13.             return 0;
  14.     //排除所有,剩余的是质数
  15.     return 1;

10、博弈-NIm游戏

n个石子,两个人取,每次可以取1-m个石子,谁取到最后一个石子就赢得比赛,取的局面为(m+1)的时候必输,且为(m+1)的倍数时候也必输。

11,new Comparator<>(){}

int compare(Integer o1,Integer o2)方法中的简单写法为:return o1-o2;

一般最简单写法:

  • Collections.sort(arr,(o1,o2)->o1.val-o2.val);// 升序
  • Collection.sort(arr,(o1,o2)->{return o1.val-o2.val;}
  • new Comparator<>(){}中的int compare(Integer o1,Integer o2)
  • Arrays.sort(T[],new Comparator<>(){});

12,Arrays.copyOf(arr[],len)和System.arraycopy(src, srcPos, dest, destPos, length)

前者一般是数组的扩容,产生一个新的对象,后者是数组的复制,会对源数组进行赋值,不会产生新的数组。

13,快速排序

思想:随机取一个值作为基准(一般去做下标),对数组的值分为大于和小于基准两部分,然后采用递归的方式全部使得数组有序。

  1. public static void quickSort(int []nums,int l,int r){
  2. if(l<r){
  3. int index=partition(nums,l,r);
  4. //分治递归
  5. quickSort(nums,l,index-1);
  6. quickSort(nums,index+1,r);
  7. }
  8. }
  9. // partition就是让按照基准划分两部分
  10. public static int partition(int []nums,int l,int r){
  11. int flag=l;//标识
  12. int index=l+1;//标识右部分的初始位置
  13. for(int i=index;i<=r;i++){
  14. if(nums[i]<nums[flag]){
  15. // 交换
  16. swap(nums,i,index);
  17. index++;
  18. }
  19. }
  20. //将flag和前半部分最后一个进行交换
  21. swap(nums,index-1,flag);
  22. // index-1是标识的下标
  23. return index-1;
  24. }
  25. public static void swap(int [] nums,int i,int j){
  26. int t=nums[i];
  27. nums[i]=nums[j];
  28. nums[j]=t;
  29. }

14,N皇后问题-回朔法

NxN的期盼,放置n个皇后,要求行列对角线不能重复。

  1. 思路一:一行一行进行试探,每次试探一步进行标记,然后求出所有的可能。
  2. 思路二:用arr[n]记录每次放皇后的列行,arr[i]表示第i行的皇后位置放在arr[i]位置上面,满足列不相等的情况只要arr[i]!=arr[j](j<i),对角线不相等的情况是i+arr[i]!=j+arr[j],进行递归即可。
  1. class Main {
  2. static int resultCount = 0;
  3. private static boolean place(int[] arr, int s) {
  4. for(int i = 0; i < s; i++) {
  5. if((arr[i] == arr[s]) || (Math.abs(i-s) == Math.abs(arr[i]-arr[s]))) {
  6. return false;
  7. }
  8. }
  9. return true;
  10. }
  11. public static void tria(int[] arr, int i, int n) {
  12. if(i >= n) {
  13. // 打印出来
  14. for(int j=0;j<8;j++){
  15. for(int k=0;k<8;k++){
  16. if(arr[j]==k){
  17. System.out.print("*");
  18. }else{
  19. System.out.print(".");
  20. }
  21. }
  22. System.out.println();
  23. }
  24. System.out.println("------------------------");
  25. ++resultCount;
  26. } else {
  27. for(int j = 0; j < n; j++) {
  28. arr[i] = j;
  29. if(place(arr, i)) {
  30. tria(arr, i+1, n);
  31. }
  32. }
  33. }
  34. }
  35. public static void main(String[] args) {
  36. int[] queen = new int[8];
  37. tria(queen, 0, 8);
  38. System.out.println(resultCount);
  39. }
  40. }

15,Collections常用的工具方法

排序操作

  1. void reverse(List list)//反转
  2. void shuffle(List list)//随机排序
  3. void sort(List list)//按自然排序的升序排序
  4. void sort(List list, Comparator c)//定制排序,由Comparator控制排序逻辑
  5. void swap(List list, int i , int j)//交换两个索引位置的元素
  6. void rotate(List list, int distance)//旋转。当distance为正数时,将list后distance个元素整体移到前面。当distance为负数时,将 list的前distance个元素整体移到后面

 查找替换

  1. int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的
  2. int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
  3. int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
  4. void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素
  5. int frequency(Collection c, Object o)//统计元素出现次数
  6. int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target)
  7. boolean replaceAll(List list, Object oldVal, Object newVal)//用新元素替换旧元素

 安全(Collections可以将不安全的容易变为安全的)

  1. synchronizedCollection(Collection<T> c) //返回指定 collection 支持的同步(线程安全的)collection。
  2. synchronizedList(List<T> list)//返回指定列表支持的同步(线程安全的)List。
  3. synchronizedMap(Map<K,V> m) //返回由指定映射支持的同步(线程安全的)Map。
  4. synchronizedSet(Set<T> s) //返回指定 set 支持的同步(线程安全的)set

 16,Arrays.asList(new int[]{}

数组转换成集合,直接转换成的是Array&ArrayList,并不是真正的ArrayList,在在一个new ArrayList<>(Arrays.asList(new int[]{}));

17,LinkedHashMap

应用:LRU

构造方法:public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder)

accessOrder=false表示插入顺序,true表示访问顺序,且HashMap并不能保持插入顺序,LinkedHashMap的子类从写removeEldestEntry()方法可以实现LRU固定缓冲区大小置换的功能。

18,拓扑排序

多任务存在先后,找出合法的任务执行序列,应用(课程表中的先修问题-解决存在环的问题)

思想:可以将入度为0的结点加入队列,然后进行出队为key,将其余入度为key的结点入度数减一,并将入度为0的加入队列,总的出队数等于总的结点数的话则表明存在拓扑排序。

19,数组中第k大的数-面试题

排序+找下标

小根堆,将数组一步一步加入根堆,节点数量超出k范围则剔除,直到末尾。

快速标记法-基于快速排序实,partition不变,增加quickSelect方法

  1. quickSelect(int l,int r,int k,int []nums){
  2. if(l>r)return;
  3. while(l<r){
  4. int p=partition(l,r,nums);
  5. if(p==k)return nums[p];
  6. else if(p>k) r=p-1;
  7. else l=p+1;
  8. }
  9. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/87343
推荐阅读
相关标签
  

闽ICP备14008679号