思路:set集合的add和contains
存在问题:页面做题没有自动补全,对库函数操作忘记,==set.contains()== , ==set.add()== , ==HashSet
class Solution {
public int findRepeatNumber(int[] nums) {
HashSet set = new HashSet<>();
for(int i=0;i
思路:先按列找再按行找,主要逆序找会避免很多判定操作
存在问题:一开始顺序找的,代码非常复杂,后来看了题解才去逆序找
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix==null||matrix.length==0)return false;
for(int i=0;i0&&matrix[i][j]>target)j--;
if(matrix[i][j]==target)return true;
}
return false;
}
}
思路:遍历替换
存在问题:Java里面遍历字符串不像C++可以下标操作,需要==s.charAt(i)==,并且注意==字符用单引号==,==String的length带括号==,数组的length不带括号。
class Solution {
public String replaceSpace(String s) {
String res = new String();
for(int i=0;i
思路:遍历用栈逆置
存在问题:==访问栈顶用stack.peek()==,不是top()
class Solution {
public int[] reversePrint(ListNode head) {
Stack sta = new Stack<>();
while(head!=null){
sta.push(head.val);
head = head.next;
}
int arr[] = new int[sta.size()];
int i=0;
while(!sta.isEmpty()){
arr[i++] = sta.peek();
sta.pop();
}
return arr;
}
}
思路:经典前中建树
存在问题:无
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
if(preorder==null||preorder.length==0)return null;
return build(preorder[0],0,preorder.length-1,0,inorder.length-1,preorder,inorder);
}
public TreeNode build(int root,int prel,int prer,int inl,int inr,int[] preorder,int[] inorder){
TreeNode r = new TreeNode(root);
int countL = 0;
for(int i=inl;i<=inr;i++){
if(inorder[i]==root){
countL = i-inl;
break;
}
}
int countR = prer - prel - countL;
if(countL>0)r.left = build(preorder[prel+1],prel+1,prel+countL,inl,inl+countL,preorder,inorder);
else r.left = null;
if(countR>0)r.right=build(preorder[prel+1+countL],prel+1+countL,prer,inl+countL+1,inr,preorder,inorder);
else r.right = null;
return r;
}
}
思路:一开始不知道结论,就模拟减成2~m-1段去比较最大值,第一题数据弱故可以过
存在问题:无
class Solution {
public int cuttingRope(int n) {
int max = 1;
for(int m=2;mmax)max=r;
}
return max;
}
}
思路:本体需要先得出数学结论,利用结论直接算结果:
长度为n,分成m段,我们先假设是平均分,每段长度为l则有n = m*l
我们想求解最佳均分长度l 设,l为x,总长度为k, 则要分成 k/x段 ,其总乘积为
对这个式子进行求导,结果为:
显然,当x等于自然底数e(2.71828)的时候,导数为0,取最大值,2.718282介于2和3之间,通过分别带入2和3进入式子计算,发现以3为长度切段为最佳,并且有余数时:
m%3 = 1 时:最优为将长度1分配到其中一段变成 3^(m-1)*4
m%3 = 2 时:由于f(x)*3*3*2 大于f(x)*4*4,所以剩余两个长度单独成段。
存在问题:一开始一直用int,中间有样例错的离谱,一直不知道怎么回事,后来看到样例数据大小长度接近9位才意识到要用Long
class Solution {
public int cuttingRope(int n) {
long res = 1;
int p = 1000000007;
if(n<=3){
return n-1;
}
if(n%3==1){
res = 4;
n-=4;
}
else if(n%3==2&&n!=2) {
res = 2;
n-=2;
}
for(int i=0;i
思路: 贪心,计算背包剩余空间然后排序一下,模拟装填,看看最多能装多少。
存在问题:一开始不知道Java里面快排怎么用:==Arrays.sort(difference)==,并且注意,如果使用逆序排序器的话,必须声明Integer的数组。后面会有例子。
class Solution {
public int maximumBags(int[] capacity, int[] rocks, int additionalRocks) {
int difference[] = new int[capacity.length];
for(int i=0;i0&&i=difference[i]){
additionalRocks-=difference[i++];
count++;
}
else break;
}
return count;
}
}
思路:因为必须是连续放珠子,所以将相当于静态分组。小学的时候老师讲过一句话,分组就相当于在队列里插挡板,分成n组就插n-1个挡板。这句话在这里及其好用,而且只需要维护挡板两侧数之和就可以。用一个长度n-1的数组计算一下原数组两两相邻数的和,然后分别排个序,顺序取k-1个就是最小值,逆序取k-1个就是。注意这里可以只排序一遍就行了,我为了学一下逆序怎么排所以排了两遍。
存在问题:又存在Long的问题,不过这次还好,看到他题干函数返回值给的Long就意识到了。还有逆序排序器的使用:==Arrays.sort(arr,Collections.reverseOrder());==
class Solution {
public long putMarbles(int[] weights, int k) {
if(weights.length<=k)return 0;
Long arr[] = new Long[weights.length-1];
for(int i=0;i
思路:无聊,当时好像在搜动态规划的分类,想先做个简单题看看,结果来个这个,可以说分类很不准确。
问题:无
class Solution {
public boolean squareIsWhite(String coordinates) {
HashMap map = new HashMap();
map.put('a',1);
map.put('b',2);
map.put('c',3);
map.put('d',4);
map.put('e',5);
map.put('f',6);
map.put('g',7);
map.put('h',8);
if((map.get(coordinates.charAt(0))+(int)coordinates.charAt(1))%2==1)return true;
else return false;
}
}
思路:本来已经在打游戏了,女票问:你有没有做过回溯的题目,我一听名字很陌生,不过回溯这个名次在搜索里面听过,果然,搜索回溯,把返回的结果回溯稍微合并一下继续向上返回。
存在问题:不熟悉char转int的操作,直接强转结果得到了ASCII爆了空指针。
class Solution {
public List letterCombinations(String digits) {
HashMap hashMap = new HashMap();
hashMap.put(2,"abc");
hashMap.put(3,"def");
hashMap.put(4,"ghi");
hashMap.put(5,"jkl");
hashMap.put(6,"mno");
hashMap.put(7,"pqrs");
hashMap.put(8,"tuv");
hashMap.put(9,"wxyz");
if(digits==null||digits.length()==0)return new ArrayList<>();
return dfs("",0,digits,hashMap);
}
public List dfs(String res, int it,String digits,HashMap hashMap){
Listlist = new ArrayList<>();
if(it>=digits.length()){
list.add(res);
return list;
}
int num = (int)(digits.charAt(it)-'0');
String des = hashMap.get(num);
for(int i=0;icurr = dfs(res+c,it+1,digits,hashMap);
for(int j=0;j
为了春招开始刷题,第一天感觉还可以,简单题就不再刷了,坚持在网页刷题练习,不依赖IDE的提示。不能总是待在舒适区里里面,最不想做的东西要做起来,KMP和Manacher每次学每次会然后又忘了,需要重新抓起来。然后就是各类数据结构和算法的实现要去手写,现在又chatGPT了,不需要依赖网码看标准答案,并且手写他还可以帮助纠错。
提交也要谨慎一下,多注意题干要求和数据量大小,提交前先多思考极端案例,避免提交次数太多的问题。