重拾刷题路01

算法实战】Keystone变换:从原理到MATLAB实现的距离走动校正 本文深入解析Keystone变换在雷达信号处理中的距离走动校正应用,从原理到MATLAB实现全面讲解。通过三种实现方法(DFT+IFFT、Sinc插值、Chirp-Z变换)的对比分析,结合实战案例展示如何有效解决高速目标导致的距离单元跨越问,提升多普勒频谱聚焦质量。 阅读详情

2022-02-13

78.Subsets(Medium)

https://leetcode.com/problems/subsets/

给出不含重复数字的数组,返回所有不含重复元素的子集。

(1)级联(通过增加一个数字,生成新的集合)

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        result.add(new ArrayList<>());
        
        for (int num : nums) {
            List<List<Integer>> subList =  new ArrayList<>();
            for (List<Integer> list : result) {
                List<Integer> newList = new ArrayList<>();
                newList.addAll(list); // 复制现有结果
                newList.add(num); // 把新的数字加进去
                subList.add(newList);
            }
            result.addAll(subList); // 把本次加完数字产生的集合加到结果中
        }
        
        return result;
    }
}

 (2)递归回溯法

使用回溯法,和人的解题思路类似,先固定第一个数字,然后选第二个数字,以此类推。

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        for (int size = 0; size <= nums.length; size++) {
            recursive(0, size, new ArrayList<>(), nums, result);
        }
        return result;
    }
    
    public void recursive(int startPos, int resSize, List<Integer> list, int[] nums, List<List<Integer>> result) {
        if (list.size() == resSize) {
            result.add(new ArrayList<>(list));
            return;
        }
        for (int pos = startPos; pos < nums.length; pos++) {
            list.add(nums[pos]);
            recursive(pos + 1, resSize, list, nums, result);
            list.remove(list.size() - 1);
        }
    }
}

 67.Add Binary(Easy)

https://leetcode.com/problems/add-binary/

注意补零,由于StringBuilder只能补在最后,所以要先reverse,再补零,再reverse回来。

注意进位的逻辑。

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder result = new StringBuilder();
        int lengthA = a.length();
        int lengthB = b.length();
        int length = 0;
        // 把短的字符串前面补0
        if (lengthA > lengthB) {
            length = lengthA;
            StringBuilder sb = new StringBuilder(b).reverse();
            for (int i = 1; i <= (lengthA - lengthB); i++) {
                sb.append('0');
            }
            b = sb.reverse().toString();
        } else if (lengthB > lengthA) {
            length = lengthB;
            StringBuilder sb = new StringBuilder(a).reverse();
            for (int i = 1; i <= (lengthB - lengthA); i++) {
                sb.append('0');
            }
            a = sb.reverse().toString();
        } else {
            length = lengthA;
        }
        // 是否要进位
        boolean plus = false;
        for (int pos = length - 1; pos >= 0; pos--) {
            char charA = a.charAt(pos);
            char charB = b.charAt(pos);
            char charResult;
            if (charA == '0' && charB == '0') {
                charResult = plus ? '1' : '0';
                plus = false;
            } else if (charA == '1' && charB == '1') {
                charResult = plus ? '1' : '0';
                plus = true;
            } else {
                charResult = plus ? '0' : '1';
            }
            result.append(charResult);
            if (pos == 0 && plus) { // 最后还有进位需要加一位
                result.append('1');
            }
        }
        return result.reverse().toString();
    }
}

228. Summary Ranges(Easy)

https://leetcode.com/problems/summary-ranges/

fast和slow两个指针即可。这里用了两个while循环,但是实际的时间复杂度还是O(n)。

class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> result = new ArrayList<>();
        if (nums.length == 0) {
            return result;
        }
        int slow = 0;
        int fast = 0;
        while (slow < nums.length && fast < nums.length) {
            String str = String.valueOf(nums[slow]);
            while (fast < nums.length - 1 && nums[fast + 1] == nums[fast] + 1) {
                fast++;                
            }
            if (fast != slow) {
                str = str + "->" + nums[fast];
            }
            slow = fast + 1;
            fast = slow;
            result.add(str);
        }
        return result;
    }
}

2022-02-20

14. Longest Common Prefix(Easy)

https://leetcode.com/problems/longest-common-prefix/

垂直扫描循环,一共两层

public String longestCommonPrefix(String[] strs) {
        StringBuilder commonPrefix = new StringBuilder();
        int index = 0;
        boolean end = false;
        while (true) {
            String commonChar = null;
            for (String str : strs) {
                if (index == str.length()) {
                    end = true;
                    break;
                }
                if (commonChar != null && !String.valueOf(str.charAt(index)).equals(commonChar)) {
                    end = true;
                    break;
                }
                commonChar = String.valueOf(str.charAt(index));
            }
            if (end) {
                return commonPrefix.toString();
            }
            commonPrefix.append(commonChar);
            index++;
        }
    }

263. Ugly Number(Easy)

https://leetcode.com/problems/ugly-number/

用2,3,5分别去除,最后的结果,大于1不是丑数,等于1是丑数。注意:题目里说了整数,但是test case里有负数,需要直接返回false!

public boolean isUgly(int n) {
        if (n <= 0) {
            return false;
        }
        int[] uglyPrimeFactors = new int[]{2, 3, 5};
        for (int primeFactor : uglyPrimeFactors) {
            int remainder = 0;
            while (n > 1 && remainder == 0) {
                remainder = n % primeFactor;
                if (remainder == 0) {
                    n = n / primeFactor;
                }
            }
        }
        return n == 1;
    }

168. Excel Sheet Column Title(Easy)

https://leetcode.com/problems/excel-sheet-column-title/

类似一个26进制,但要注意余数为0的情况,需要补上Z,同时商减1:

public String convertToTitle(int columnNumber) {
        StringBuilder title = new StringBuilder();
        while (columnNumber > 0) {
            int remainder = columnNumber % 26;
            columnNumber = columnNumber / 26;
            if (remainder == 0) {
                title.append('Z');
                columnNumber--;
                continue;
            }
            char subTitle = (char) (remainder + 64);
            title.append(subTitle);
        }
        return title.reverse().toString();
    }

2022-02-21

26. Remove Duplicates from Sorted Array(Easy)

https://leetcode.com/problems/remove-duplicates-from-sorted-array/

非递减数组去重,要求不使用额外空间。

(1)超时的方法,时间复杂度太大,因为要双重循环:

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length == 1) {
            return 1;
        }
        int slow = 0;
        int fast = 1;
        while (fast < nums.length && nums[slow] <= nums[fast]) {
            if (nums[slow] == nums[fast]) {
                moveNum2Last(nums, fast);
            }
            if (nums[fast] != nums[slow]) {
                slow++;
                fast++;
            }
        }
        return fast;
    }

    public void moveNum2Last(int[] nums, int index) {
        for (int i = index; i < nums.length - 1; i++) {
            replace(nums, i, i + 1);
        }
    }

    public void replace(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

(2)先把重复的替换,然后再把替换的统一挪到最后

class Solution {
    public int removeDuplicates(int[] nums) {
        if (nums.length == 1) {
            return 1;
        }
        int slow = 0;
        while (slow < nums.length - 1) {
            int fast = slow + 1;
            while (fast < nums.length && nums[fast] == nums[slow]) {
                nums[fast] = 999; // 把重复的换成999
                fast++;
            }
            slow = fast;
        }
        // 把999挪到后面
        int index999 = 0;
        int indexNot999 = 0;
        while (index999 < nums.length && indexNot999 < nums.length) {
            if (nums[index999] != 999) {
                index999++; // 找到第一个999的下标
                continue;
            }
            indexNot999 = index999 + 1; // 后面第一个不是999的下标
            while (indexNot999 < nums.length && nums[indexNot999] == 999) {
                indexNot999++;
            }
            if (indexNot999 < nums.length) {
                replace(nums, index999, indexNot999);
            }
        }
        int result = 0;
        while (result < nums.length && nums[result] != 999) {
            result++;
        }
        return result;
    }

    public void replace(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

(3)i负责循环,currentPos为要替换数字的下标。

class Solution {
    public int removeDuplicates(int[] nums) {
        int currentPos = 0; // 去重后面的第一个数字的下标
        int currentNum=Integer.MIN_VALUE; // 要替换的数字
        for(int i= 0; i<nums.length; i++) {
            if(nums[i] != currentNum) { // 不相等时,说明找到了下一个更大的数字
                nums[currentPos] = nums[i];
                currentNum = nums[i];
                currentPos++;
            }
        }
        return currentPos;
    }
}

Uniapp H5端SEO优化全攻略:提升搜索引擎排名与流量 在移动互联网时代,H5页面因其跨平台、低成本、易传播的特性,成为许多企业的首选。Uniapp作为一款优秀的前端跨端开发框架,能够快速开发H5、小程序、App等多端应用。然而,由于Uniapp默认采用SPA(单页应用)架构,H5端在SEO(搜索引擎优化)方面存在一定劣势,如爬虫难以抓取动态内容、页面标和描述不易优化等。 本文将系统性地介绍Uniapp H5端的SEO优化方案,涵盖基础优化、SPA优化策略、内容优化、技术优化、外部优化及监测分析,帮助开发者提升网站在搜索引擎中的排名,获取更多自然流量。 阅读详情

相关推荐

卡诺图化简法

目录 1.学前需要了解知识点 2.卡诺图(karnaugh map) 3.逻辑函数的卡诺图化简法 4.总结 1.学前需要了解知识点 最小项的定义 最小项的表示方法 最小项的相邻性 最小项的定义:一个函数的某个乘积项包含了函数的全部变量,其中每个变量都以原变量或反变量的形式出现,且仅出现一次,则这个乘积项称为该函数的一个标准积项,通常称为最小项。 最小项的表示方法:通常用来表...

hahasusu的专栏 17万+

041-leetcode-其他-杨辉三角

package other; import java.util.ArrayList; import java.util.List; /** * 杨辉三角 * 给定一个非负整数numRows,生成杨辉三角的前numRows行。 * * * * 在杨辉三角中,每个数是它左上方和右上方的数的和。 * * 示例: * * 输入: 5 * 输出: * [ * [1], * [1,1], * [1,2,1], * [1,3,3,1], * [...

好好学习,天天向上 119

华为OD机考双机位C卷 - 信道分配(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 信道分配

算法大师! 402

【重拾算法01-STL

做程序开发,广度和深度是同样重要的,也许现在的工作中不会直接用上,但是算法、设计模式等等这些底层的知识时候熟练掌握,是我们能不能走得更远的前提,我觉得是时候,再重拾起已经快遗忘的算法,为自己的下一个三年,储备更多的基础知识。

luciozhang的博客 1239

苍穹外卖重拾01

基础上下文,存储当前线程用户信息包含账号锁定、账号未找到、登录失败等各种业务异常都是继承自RuntimeException,因为java中只有这个类及其子类才是“非受检异常”不需要显示捕获或声明抛出,而对其他类,编译器会强制检查。用是为了让业务异常“可抛可不捕”,由调用者或全局处理器决定是否处理,避免代码被try-catch淹没约束它只能出现在方法级别;保证该注解会被编译进.class文件,并且在运行时通过反射可读。因此,AutoFill成为一个“可反射的元数据标记”。

2303_79435934的博客 1287

重拾数据库01

重拾数据库 由头:数据库本来暑假学了一半,奈何没有实战,逐步失去动力,渐渐遗忘了……如今再度需求,只好重拾一下了。 今天先整理之前的笔记吧,不得不说Markdown还是挺好用的,先进行笔记整理回顾 数据库的操作形式 得益于sqlyog等可视化界面,我们可以不必记住那么多指令,所以操作形式主要分为可视化操作和代码操作,代码大多是通用的,但是实现代码的平台可能有些会有特异化的语句,这个是后话了 代码操作 数据库操作主要有3层:数据库,数据库中的表,表中的字段 代码形式我都是基于sqlyog软件的语句,sqlyo

makerjack001的博客 198

重拾C语言01

/*目要求:1,2,3,4四个数字可以组成多少个互不重复的三位数的数字? 程序分析:每一次排列个,十,百位都可以有四种情况, 第一步先把所有情况都找出来 第二步把不符合的情况剔除*/ #include<stdio.h>/*头文件 */ int main()/*主函数*/ { int i,j,k;/*赋值-i,j,k*/ printf("\n");/*\n 换行符*/ for(i=1;i<5;i++)/*三重循环:每一位数都有四种情况,因为都是整型数据,所以取5为分值点*/

weixin_46181877的博客 146

重拾C++之菜鸟算法第16篇 --- 动态规划(总结篇)

确定递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])确定递推公式:dp[j] = max(dp[j], dp[j - weight[i]] + value[i])首先确定dp数组含义:dp[j] 表示 容量为 j 的背包能背的最大价值是 dp[j]首先确定dp数组含义:dp[j] 表示 容量为 j 的背包能背的最大价值是 dp[j]首先确定dp数组含义:dp[j] 表示 容量为 j 的背包有 dp[j] 种方法。

FAQ的博客 543

重拾爬虫day01

先是要引用的库的作用: import urllib.request,urllib.error #制定url,获取网页数据 import _sqlite3 #进行sqlite数据库操作 from bs4 import BeautifulSoup #网页解析,获取数据 import re #正则表达式,进行文字匹配 import xlwt #进行excel操作 第一步就是获取网页 def askURL(url): head={ "User-Agent": "Mozilla / 5.0(

老白菜c的博客 134

《重拾算法01 c++工具目录

本章主要是用来记录算法学习过程中使用到的一些工具,以后也会不断的更新。 文章目录1 迭代器定义和初始化常用操作使用举例2 集合 set3 1 迭代器 定义和初始化 迭代器是一种检查容器内元素并遍历元素的数据类型。C++更趋向于使用迭代器而不是下标操作,因为标准库为每一种标准容器(如vector)定义了一种迭代器类型,而只用少数容器(如vector)支持下标操作访问容器元素。 每种容器都定义了自...

RENyunfan 271

职场乏味?重拾工作激情的秘诀,让你重新燃起职业热情

记住,每个小目标的达成都值得庆祝,犒赏自己,这样才能更好地保持自我效能感,走出职场倦怠期,不断迈向成功的道。然而,当我们长大后,才逐渐认识到自己的实际情况,发现自己只是普通的打工人,无法登上太空,也无法从事高科技领域的研究。想象一下,如果我们本以为升职加薪的机会应该属于自己,最终却被别人获得,这种情况下,我们肯定会心存不甘,难免会产生一些“有黑幕”、“不公平”的想法。同样的道理,当我们在职场中,错误地认为自己具备超群的能力,应该成为经理或者担任高级职位时,实际上我们只是一个小主管,我们的能力也仅限于此。

qq_39891419的博客 279

力扣(合并区间)

给定一组可能重叠或相邻的整数区间,合并所有重叠或端点相接的区间,返回不重叠的最小区间列表。例如输入 [[1,3],[2,6],[8,10],[15,18]],输出 [[1,6],[8,10],[15,18]]。核心是先按左端点升序排序,再单次线性扫描完成合并,避免暴力两两比较。

weixin_52811458的博客 299

LeetCode 155. 最小栈|Python 解法详解

这道的关键是:使用主栈保存数据,辅助栈在每一层同步保存“截至当前位置的最小值”。理解这一点后,再结合边界条件检查,代码就能保持清晰且稳定。

a1250467048的博客 236

LeetCode 1. 两数之和 | 从暴力枚举到哈希表最优解 + 空间换时间思想全复盘

文章摘要 目要求在数组中找到两数之和等于目标值的下标。核心思是优化查找效率: 暴力法:双重循环枚举所有数对,时间复杂度O(n²),效率低但易实现。 哈希表优化:利用哈希表O(1)查找特性,遍历时存储已访问元素,每次计算差值并查询,时间复杂度降至O(n)。关键细节是先查后存,避免自匹配。 代码实现:哈希表法通过一次遍历完成,空间换时间,边界处理需注意空数组和不足两元素的情况。 常见错误:内层循环起始点、哈希表键值设计、立即返回结果等易错点需警惕。 面试要点:优先选择哈希表解法,解释与暴力法的差异,强调时间

yc2284238579的博客 256

LeetCode //MySQL - 1204. Last Person to Fit in the Bus

This SQL query solves the problem of finding the last person who can board a bus without exceeding the 1000 kg weight limit. The solution involves: Calculating a running total of weights ordered by boarding turn using a window function Filtering to only in

Made in Code 367

leetcode】153. 寻找旋转排序数组中的最小值js

本文介绍了在旋转排序数组中寻找最小值的二分查找算法。通过比较中间元素与数组末尾元素,可以确定最小值所在区间:若中间值大于末尾值,则最小值在右侧;否则在左侧或当前位置。文章提供了两种实现方式,第一种通过样例总结返回nums[l],第二种采用更标准的二分写法,确保循环结束时left==right。两种方法时间复杂度均为O(logn),适用于解决LeetCode相关目。关键点在于利用旋转数组的特性缩小搜索范围。

2402_83244812的博客 150

LeetCode //C - 1203. Sort Items by Groups Respecting Dependencies

This problem involves sorting items with group constraints and dependency relations. The key steps are: Assign unique groups to items with no group (-1) Build dependency graphs for both items and groups Perform topological sorting on both graphs If both so

Made in Code 374

LeetCode hot100——最大子数组和

给你一个整数数组nums,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。是数组中的一个连续部分。6连续子数组 [4,-1,2,1] 的和最大,为 6。nums = [1]123如果你已经实现复杂度为O(n)的解法,尝试使用更为精妙的求解。

weixin_42927227的博客 212

10.LeetCode算法讲解--滑动窗口--最大连续为一的个数

利用滑动窗口解决最大连续1的个数

Jammy_1的博客 219

栈和队列专(三):LeetCode 622. 设计循环队列|数组环形复用 + front/rear 边界详解

本文详细讲解了循环队列的设计与实现,重点分析了如何利用数组实现环形结构以避免空间浪费。文章首先通过示例说明普通数组队列的"假溢出"问,然后提出循环队列的解决方案。核心内容包括:1. 采用牺牲一个存储位置的方案区分队列空满状态;2. 明确front和rear指针的语义(front指向队首元素,rear指向下一个可插入位置);3. 使用取模运算实现下标的循环移动。文章完整实现了LeetCode 622要求的全部接口,并分析了各种边界情况,特别是队尾元素的获取方法。最后对比了数组实现与链式

Luminousone的博客 470

LeetCode 3597.分割字符串

时间复杂度:O(n) 或 O(n∣Σ∣),其中 n 是 s 的长度,∣Σ∣=26 是字符集合的大小。空间复杂度:O(n) 或 O(n∣Σ∣)。只要当前段是唯一的,就将其加入段列表,标记为已经出现过,并从下一个下标开始构建新的段。因此,最终输出为 [“a”, “b”, “bc”, “c”, “cc”, “d”]。输出: [“a”,“b”,“bc”,“c”,“cc”,“d”]因此,最终输出为 [“a”, “aa”]。输入: s = “abbccccd”输入: s = “aaaa”输出: [“a”,“aa”]

tus00000的博客 221

ArcGIS二次开发电子书合集,arcgis二次开发教程,C#

ArcGIS二次开发何及,包括ArcGIS engine开发实例教程,中文开发指南清洗版,ArcGIS Engine轻松入门,ArcGIS Engine10开发手册

SHDAE-DS-3043 GC9307C DataSheet V1.1

GC9307C 屏驱动资料和初始化代码

上一篇: awk命令详解(二)
下一篇: 重拾刷题路02
oldmanw
博客等级 码龄12年 10粉丝 · 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值