每周算法(week 1)【leetcode1~10】

前言

        今天开始刷面试算法题,虽然之前在蓝桥杯、程序设计天梯赛中拿过两个省一和一个国三,但是基本靠的都是我对 Java 语言的熟悉,至于算法我只会基本的双指针、快慢指针、差分数组等,最擅长的其实还是暴力。但是自认为应付面试还是远远不够的,所以今天开始是该好好修炼一下算法了。

leetcode 编号完成时间复习时间
1. 两数之和2024-06-30
2. 两数相加2024-06-30
3. 无重复字符的最长子串2024-06-30
4. 寻找两个正序数组的中位数2024-07-01
5. 最长回文串2024-07-01
6. 
7.
8. 
9. 回文数2024-07-02
10. 

1、两数之和(哈希)

1.1、暴力法 

  • 思路💡:双重遍历,确保数组中每两个数字都进行过一次求和,直到找到 nums[i] + nums[j] = target 的两个目标索引
  • 时间复杂度🕖: O(n2)
class Solution {public int[] twoSum(int[] nums, int target) {int[] res = new int[2];for(int i=0;i<nums.length-1;i++){for(int j=i+1;j<nums.length;j++){if(nums[i]+nums[j]==target){res[0]=i;res[1]=j;return res;}}}return nums;}
}

1.2、哈希表

  • 思路💡:使用一个哈希表来存储遍历过的元素,每次插入元素前判断是否存在 target - nums[i]
  • 时间复杂度🕖:因为哈希表的插入和查询操作的复杂度是 O(1),所以总的时间复杂度是 O(n)
class Solution {public int[] twoSum(int[] nums, int target) {int[] res = new int[2];Map<Integer,Integer> map = new HashMap<>();for(int i = 0; i < nums.length; i++){if(map.containsKey(target-nums[i])){res[0] = map.get(target-nums[i]);res[1] = i;return res;}else{map.put(nums[i],i);}}return nums;}
}

2、两数相加(模拟)

 2.1、模拟算法

  • 思路💡:模拟普通列式计算的过程,用变量 t 代表当前位的计算和,则 t%10 为当前位的结果,t/10 作为下一轮计算的加数
  • 时间复杂度🕖:O(n)
class Solution {public ListNode addTwoNumbers(ListNode l1, ListNode l2) {ListNode dummy = new ListNode(-1); // 首节点ListNode cur = dummy; // 当前节点(负责穿针引线,将每位的结果连起来)int t = 0; // 每位的计算和while(l1 !=null || l2 !=null || t!=0){if(l1!=null){t += l1.val;l1 = l1.next;}if(l2!=null){t += l2.val;l2 = l2.next;}cur.next = new ListNode(t % 10);t /= 10;cur = cur.next;}return dummy.next;} 
}

3、无重复字符的最长子串(双指针——前后指针)

3.1、暴力法

  • 思路💡:双重循环,遍历每一种没有重复字符的字符串组合
  • 时间复杂度🕖:O(n2)
class Solution {public int lengthOfLongestSubstring(String s) {if(s.length()==0 || s.length()==1) return s.length();char[] arr = s.toCharArray();int max = Integer.MIN_VALUE;for(int i=0;i<arr.length-1;i++){Map<Character,Integer> map = new HashMap<>();map.put(arr[i],1);for(int j=i+1;j<arr.length;j++){if(map.containsKey(arr[j])) break;else map.put(arr[j],1);}max = Math.max(max,map.size());}return max;}
}

3.2、前后指针 

  • 思路💡:指针 j 负责在前面探索,当哈希表中存在索引 j 的元素时,指针 i 开始移动,直到区间内没有重复元素
  • 时间复杂度🕖:由于 i,j 均最多增加n次,且哈希表的插入和更新操作的复杂度都是 O(1)
    ,因此,总时间复杂度 O(n)
class Solution {public int lengthOfLongestSubstring(String s) {char[] arr = s.toCharArray();Map<Character,Integer> map = new HashMap<>();int res = 0;for(int i=0,j=0;j<arr.length;j++){map.put(arr[j],map.getOrDefault(arr[j],0)+1);while(map.get(arr[j]) > 1){map.put(arr[i],map.get(arr[i++])-1);}res = Math.max(res,j - i + 1);}return res;}
}

4、寻找两个正序数组的中位数(归并排序)

  • 思路💡:使用归并算法将两个数组合并
  • 时间复杂度🕖:O( n + m )n 和 m 分别是两个数组的长度
class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int m = nums1.length;int n = nums2.length;int[] nums = new int[m+n];// 如果nums1为空,则直接返回nums2的中位数if (m == 0) {if (n % 2 == 0) {return (nums2[n / 2 - 1] + nums2[n / 2]) / 2.0;} else {return nums2[n / 2];}}// 如果nums2为空,则直接返回nums1的中位数if (n == 0) {if (m % 2 == 0) {return (nums1[m / 2 - 1] + nums1[m / 2]) / 2.0;} else {return nums1[m / 2];}}int count = 0; // 合并后的数组的索引int i = 0,j = 0; // nums1 和 nums2 的索引while(count != (m+n)){if(i == m){ // 如果数组 nums1 的元素合并完毕while(j != n){nums[count++] = nums2[j++];}break;}if(j == n){while(i != m){nums[count++] = nums1[i++];}break;}if(nums1[i] < nums2[j]){nums[count++] = nums1[i++];}else{nums[count++] = nums2[j++];}}// 到这里已经合并结束了 count=nums.lengthreturn count%2==0?(nums[count/2-1] + nums[count/2])/2.0:nums[count/2];}
}

 5、最长回文子串

5.1、双指针 + 暴力

  • 思路💡:使用双指针判断字符串是否是回文串,然后使用双重循环枚举出每一种子串
  • 时间复杂度🕖:O( n3 )
class Solution {public String longestPalindrome(String s) {String longest = "";for(int i=0;i<s.length();i++){for(int j=i+1;j<s.length()+1;j++){String sub = s.substring(i,j);if(isPalindrome(sub)){longest = sub.length()>longest.length()?sub:longest;}}}return longest;}/*** 双指针判断回文串*/public boolean isPalindrome(String str){int i = 0,j = str.length()-1;while(str.charAt(i) == str.charAt(j)){if(i >= j) return true;i++;j--;}return false;}
}

5.2、 中心扩散法

  • 思路💡:暴力枚举所有回文串的中心,然后使用中心扩散计算回文串的长度
    • 首先寻找边界,因为回文串的中心可能不是一个字符(比如 "abba",或者 "abbba" ,这种可以统一将右指针移动到边界)
    • 此时,左右指针都指向相同的字符,然后左右指针开始同时扩散,找到该中心最长的回文串
    • 长度 =  右指针 - 左指针 + 1
  • 时间复杂度🕖:O(N2)
class Solution {public String longestPalindrome(String s) {int left=0,right=0;int max = 0; // 最长for(int i=0;i<s.length();i++){int subLeft = i,subRight = i;// 寻找右边界while(subRight<s.length()-1 && s.charAt(i)==s.charAt(subRight+1)){subRight++;}// 左右扩散while(subRight<s.length()-1 && subLeft-1>=0 && s.charAt(subLeft-1)==s.charAt(subRight+1)){subLeft--;subRight++;}int len = subRight - subLeft + 1;if(len > max){left = subLeft;right = subRight;max = len;}}return s.substring(left,right+1);}
}

 6、Z 字形变换

感觉这种题对面试没意义,跳过

7、整数反转

纯数学题,跳过

8、字符串转换整数

纯模拟题,这类题做太多了,基本通过了,剩下个别一两个用例懒得写了,意义不大。

这里写一下从中学到的一点,从来没相关在算法里 try-catch 不过还挺好用的:

        try{if(Long.parseLong(sb.toString())< Integer.MIN_VALUE){return Integer.MIN_VALUE;}else if(Long.parseLong(sb.toString()) > Integer.MAX_VALUE){return Integer.MAX_VALUE;}}catch(Exception e){return 0;}

9、回文数

  • 思路💡:双指针
  • 时间复杂度🕖:O(N)
class Solution {public boolean isPalindrome(int x) {String s = String.valueOf(x);int i = 0,j = s.length()-1;while(s.charAt(i) == s.charAt(j)){if(i>=j)    return true;i++;j--;}return false;}
}

10、正则表达式

  • 思路💡没有思路,纯模拟,而且是最难的模拟
  • 时间复杂度🕖:

果断放弃,之后有思路了 再来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/39131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Kimi 上下文缓存功能开启公测!降低使用费用,加快模型相应速度

7月2日&#xff0c;系统之家发布消息&#xff0c;月之暗面科技有限公司旗下的Kimi开放平台正式推出上下文缓存功能&#xff0c;并已开放公测。这项功能专为处理频繁请求和大量重复引用初始上下文的场景设计&#xff0c;能有效降低使用长文本模型的成本&#xff0c;并显著提升处…

基于java+springboot+vue实现的旅游管理系统(文末源码+Lw)227

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本旅游管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助使用者在短时间内处理完毕庞大的数据信息&a…

HMM,EM算法(Expectation-Maximization Algorithm) VAE)以及KL散度

HMM&#xff0c;EM算法&#xff08;Expectation-Maximization Algorithm&#xff09; VAE&#xff09;以及KL散度 最大化对数似然&#xff08;或称为最大化对数似然函数&#xff09;是在统计学中用来估计模型参数的一种常用方法。其基本思想是找到一组参数值&#xff0c;使得在…

本地文本向量模型的部署提供兼容openai的接口

前言 之前部署了fastgpt官方文档的一个,提供的一个m3e-large的向量模型打包的docker镜像,虽然使用起来整体效果还可以,但是有些文本向量相似度匹配的结果还是不太满意的,目前,网络上层出不穷的带推理文本向量,想体验一下,于是我基于modelscope库封装了一个兼容open ai的…

探索视觉世界:深入了解目标检测算法的奥秘

目标检测算法 一、介绍目标检测算法的背景和意义1.1 目标检测的定义和应用场景1.2 目标检测算法的发展历程 二、目标检测算法分类2.1 传统目标检测算法2.1.1 基于分类器的目标检测算法2.1.2 基于模板匹配的目标检测算法 2.2 深度学习目标检测算法2.2.1 两阶段目标检测算法2.2.2…

Android Gradle 开发与应用 (四): 多模块构建与组件化,提升Android开发效率的途径

目录 1. 多模块构建的基本概念 2. 组件化的基本概念 3. 多模块构建与组件化的优势 4. 多模块构建的实现方法 5. 组件化的实现方法 6. 多模块构建与组件化的实践 7. 案例分析 8. 未来展望 结语 随着移动应用的功能日益复杂&#xff0c;单一模块开发方式的弊端愈加明显。…

全国范围内严格推行双休制才是劳动力使用方面面向未来和可持续发展的

我有以下理由&#xff1a; 合法依规 每天不超8小时、每周不超过40小时&#xff0c;这是国务院令第146号&#xff0c;很多年前就明确要求的&#xff0c;在国有企业和事业单位也早就推行了很多年的&#xff1b;对确有实际需要的岗位&#xff0c;也有经过行政审批的“不定时工作…

2024年广东省食品安全管理员考试精选练习题库

76.已具有主体资格的企业申请食品流通可&#xff0c;该企业的&#xff08;&#xff09;为可申请人。 A.投资者 B.经营负责人 C.本身 答案&#xff1a;C 77.食用亚硝酸盐的销售只面向&#xff08;&#xff09;。 A.食品生产加工行业 B.餐饮业 C.食品流通单位 答案&…

微软账户和本地账户有什么区别?如何切换登录账户?

Windows 操作系统是目前世界上比较流行的操作系统之一&#xff0c;在使用 Windows 系统的时候都需要我们进行登录&#xff0c;其中我们可以使用微软账户或者本地账户进行登录&#xff0c;那本地账户和微软账户有什么区别&#xff1f;下面就带大家了解一下微软账户和本地账户。 …

基于机器学习的零售商品销售数据预测系统

1 项目介绍 1.1 研究目的和意义 在电子商务日益繁荣的今天&#xff0c;精准预测商品销售数据成为商家提升运营效率、优化库存管理以及制定营销策略的关键。为此&#xff0c;开发了一个基于深度学习的商品销售数据预测系统&#xff0c;该系统利用Python编程语言与Django框架&a…

惠海 H6900B 2.7V3.7V4.2V5V9V升12V24V48VLED升压恒流芯片IC

惠海H6900B LED升压恒流芯片IC是一款功能丰富的LED驱动解决方案&#xff0c;为高亮度LED灯串设计。以下是针对该产品的进一步分析和解释&#xff1a; 产品特点 高效率&#xff1a;高达95%以上的效率意味着在驱动LED时&#xff0c;只有很少的能量转化为热量&#xff0c;从而提…

Docker常用指令。(工作中用到的)

文章目录 Docker常用指令重启docker容器查看运行结果查看文件并跳转到指定行数查看容器日志创建容器交互式的方式创建容器后台式创建容器 退出容器 Docker常用指令 docker ps # 列出所有运行的容器 docker ps -a # 列出所有的容器 docker exec -it containerId或containerName …

SolidityFoundry 安全审计测试 memory滥用

名称&#xff1a; memory滥用 https://github.com/XuHugo/solidityproject/tree/master/vulnerable-defi 描述&#xff1a; 在合约函数中滥用storage和memory。 memory是一个关键字&#xff0c;用于临时存储执行合约所需的数据。它保存函数的参数数据&#xff0c;并在执行后…

xcrun: error: unable to find utility “simctl“, not a developer tool or in PATH

目录 前言 一、问题详情 二、解决方案 1.确认Xcode已安装 2.安装Xcode命令行工具 3.指定正确的开发者目录 4. 确认命令行工具路径 5. 更新PATH环境变量 前言 今天使用cocoapods更新私有库的时候&#xff0c;遇到了"xcrun: error: unable to find utility &…

hadoop集群部署【二】YARN MapReduce 的部署

提前注意&#xff1a;请注意路径是否和我的相同&#xff0c;放置的位置不同&#xff0c;请修改标红处 HDFS部署 HDFS介绍及部署http://t.csdnimg.cn/Q3H3Y 部署说明 Hadoop HDFS分布式文件系统&#xff0c;我们会启动&#xff1a; NameNode进程作为管理节点 DataNode进程…

欢太主题商店 官方资源提取与应用第三方资源方法一览

前言叠甲&#xff1a;支持正版&#xff0c;尊重他人劳动成果&#xff0c;反对盗版提取&#xff0c;不要传播提取版&#xff0c;我本人也在支持正版&#xff0c;但是最近懒得用主题&#xff0c;用一段时间的默认吧&#xff0c;如有主题开发者不满&#xff0c;请联系删除 &#x…

JAVA 判断一系列区间值有没有重叠

判断一系列区间值比喻 0-20 10-8 21-100 ...等等 这些区间有没有重叠的方法&#xff1a; /*** Author Minco* Date 15:44 2024-07-01* Description 区间范围*//***/ public class Interval implements Comparable<Interval> {double start;double end;public Interval(…

机器人入门路线及参考资料(机器人操作方向)

机器人&#xff08;操作方向&#xff09;入门路线及参考资料 前言1 数理基础和编程2 机器人学理论3 计算机视觉4 机器人实操5 专攻方向总结Reference: 前言 随着机器人和具身智能时代的到来&#xff0c;机器人越来越受到大家的重视&#xff0c;本文就介绍了机器人&#xff08;…

基于SpringBoot民宿管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;…

13-4 GPT-5:博士级AI,人工智能的新时代

图片来源&#xff1a;AI Disruptive 人工智能世界正在迅速发展&#xff0c;新的创新和突破层出不穷。在本文中&#xff0c;我们将深入探讨最新的进展&#xff0c;从即将推出的 GPT-5 模型到 Apple 和 Meta 之间可能的合作。 GPT-5&#xff1a;博士级别的人工智能 虽然尚未正…