# LeetCode **Repository Path**: thxxin/leetcode ## Basic Information - **Project Name**: LeetCode - **Description**: leetcode刷题 - **Primary Language**: Java - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-09-01 - **Last Updated**: 2022-09-01 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 算法笔记 ## 1.算法中的一些技巧 ### 1.字符串相关 - 字符大小写转换 ```java char n='a'; n^=' ' ; //大小写相互转换,都可以这样写 ``` - 将字符数组转换为字符串 ```java String s=String.valueOf(char[] c) ``` - 遇到**字符串替换相关**的,首先考虑将字符串转换为数组,不要先想着StringBuilder。 - 判断字符是否为数字 Character.isDigit(); - 去除字符串首尾的空格 s.trim() - 将List 转换为 int 数组 ```java list.stream().mapToInt(Integer::intValue).toArray(); ``` - String.join(" - ",list) 将list中的元素使用 “-” 拼接起来。 ``` list={"a","b","c"} //拼接之后 a-b-c ``` ### 2.数组(数字)相关 - java 中保存两位小数 ```java double a=3.1415926 System.out.println("a: %.2f",a); ``` - 将整数转化为二进制字符串 Integer.toBinaryString(n); - 比起Stack,建议使用Deque。原因:这个是Java历史遗留问题,Stack继承了Vector且是Vector的唯一子类,Vector逐渐被Java抛弃了,且Stack是实体类,Deque是一个通用接口,使用起来更灵活,查Java api中java.util.Stack中官方文档也给出了使用Deque来代替Stack的建议。 - stack.pop()和stack.peek()的区别: peek 不改变栈的值(不删除栈顶的值),pop会把栈顶的值删除。 - 统计数组中每个字符出现的次数: map.put(num,map.getOrDefault(num,0)+1); } ### 3.其他 - 快速幂 ```java private long fastPow(long x, long n) { long res=1; while (n>0){ if (n%2==1) res=(res*x)%MOD; x=(x*x)%MOD; n/=2; } return res; } ``` - 遇到子数组或者子字符串问题,可以用一个boolean值来标记起始位置。 ```java //题目描述: 给你一个字符串 num ,该字符串表示一个大整数。另给你一个长度为 10 且 下标从 0 开始 的整数数组 change ,该数组将 0-9 中的每个数字映射到另一个数字。更规范的说法是,数字 d 映射为数字 change[d] 。 你可以选择 突变 num 的任一子字符串。突变 子字符串意味着将每位数字 num[i] 替换为该数字在 change 中的映射(也就是说,将 num[i] 替换为 change[num[i]])。 请你找出在对 num 的任一子字符串执行突变操作(也可以不执行)后,可能得到的 最大整数 ,并用字符串表示返回。 子字符串 是字符串中的一个连续序列。 public String maximumNumber(String num, int[] change) { boolean flag = false; char[] chArr = num.toCharArray(); for (int i = 0; i < chArr.length; i++) { int tmp = chArr[i] - '0'; if (flag && tmp> change[tmp]) { break; } if (tmp < change[tmp]) { chArr[i] = (char) ('0' +change[tmp]); flag = true; } } return new String(chArr); } ``` - 看到一个题之后,首先看能不能使用递归。 - 约瑟夫问题公式: f(N,M)=(f(N−1,M)+M)%N 详细解释:https://blog.csdn.net/u011500062/article/details/72855826 代码实现: ```java int cir(int n,int m){ int p=0; for(int i=2;i<=n;i++) { p=(p+m)%i; } return p+1;} ``` - 判断链表中是否有环的问题,可以使用哈希表或者**快慢指针**。 ## 2.遇到还不会的题 - 正则表达式匹配 - 序列化二叉树 - 把数字翻译成字符串 - 数字序列中某一位的数字(找规律) - 复杂链表的复制 - 二叉搜索树与双向链表 - 数组中的逆序对 ## 3.debug - 在idea中进行debug时下列按钮的含义 ![image-20210804111733940](https://gitee.com/infiniteStars/picgoimages/raw/master/image-20210804111733940.png) 1. 程序向下执行一行(如果当前行有方法调用,这个方法将被执行完毕返回,然后到下一行) 2. 程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法(不会进入官方类库的方法) 3. 程序向下执行一行。如果该行有自定义方法,则运行进入自定义方法,也会进入官方类库的方法 4. 跳出该方法