【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。
文章目录
- 12.【中等】整数转罗马数字
- 151.【中等】反转字符串中的单词
- 6.【中等】Z 字形变换
- 68.【困难】文本左右对齐
- 167.【中等】两数之和 II - 输入有序数组
🌈你好呀!我是 山顶风景独好
💝欢迎来到我的博客,很高兴能够在这里和您见面!
💝希望您在这里可以感受到一份轻松愉快的氛围!
💝不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!
12.【中等】整数转罗马数字
七个不同的符号代表罗马数字,其值如下:
罗马符号 | 数值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
组合符号 | 数值 | 示例 |
---|---|---|
IV | 4 | 1 (I) 减去 1 (V) 的值 |
IX | 9 | 1 (I) 减去 10 (X) 的值 |
XL | 40 | 10 (X) 减去 1 (L) 的值 |
XC | 90 | 10 (X) 减去 100 © 的值 |
CD | 400 | 100 © 减去 1 (D) 的值 |
CM | 900 | 100 © 减去 1000 (M) 的值 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (V) 减 1 (I): IV ,9 是 10 (X) 减 1 (I):IX。仅使用以下减法形式:4 (IV),9 (IX),40 (XL),90 (XC),400 (CD) 和 900 (CM)。
- 只有 10 的次方(I, X, C, M)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V),50 (L) 或 500 (D)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
示例 1:
- 输入:num = 3749
- 输出: “MMMDCCXLIX”
- 解释:
3000 = MMM 由于 1000 (M) + 1000 (M) + 1000 (M)
700 = DCC 由于 500 (D) + 100 © + 100 ©
40 = XL 由于 50 (L) 减 10 (X)
9 = IX 由于 10 (X) 减 1 (I)
注意:49 不是 50 (L) 减 1 (I) 因为转换是基于小数位
示例 2:
- 输入:num = 58
- 输出:“LVIII”
- 解释:
50 = L
8 = VIII
class Solution { // 定义罗马数字中每个符号对应的整数值 int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; // 定义罗马数字符号 String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"}; // 将整数转换为罗马数字的方法 public String intToRoman(int num) { StringBuffer roman = new StringBuffer(); // 遍历每个罗马数字符号和对应的整数值 for (int i = 0; i < values.length; ++i) { int value = values[i]; String symbol = symbols[i]; // 当整数值大于等于当前罗马数字符号对应的整数值时 while (num >= value) { // 减去该罗马数字符号对应的整数值 num -= value; // 在字符串中添加对应的罗马数字符号 roman.append(symbol); } // 如果整数已经为0,则提前退出循环 if (num == 0) { break; } } // 返回构建的罗马数字字符串 return roman.toString(); }
}
151.【中等】反转字符串中的单词
- 给你一个字符串 s ,请你反转字符串中 单词 的顺序。
- 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
- 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
- 注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 2:
- 输入:s = " hello world "
- 输出:“world hello”
- 解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
- 输入:s = “a good example”
- 输出:“example good a”
- 解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
解题思路:
- 倒序遍历字符串 sss ,记录单词左右索引边界 iii , jjj 。
- 每确定一个单词的边界,则将其添加至单词列表 resresres 。
- 最终,将单词列表拼接为字符串,并返回即可。
class Solution { public String reverseWords(String s) { // 删除字符串s的首尾空格 s = s.trim(); // 初始化j为字符串s的最后一个字符的索引,i也为最后一个字符的索引,用于后续从后向前遍历 int j = s.length() - 1, i = j; // 创建一个StringBuilder对象res,用于构建结果字符串 StringBuilder res = new StringBuilder(); // 当i大于等于0时,继续遍历 while (i >= 0) { // 从后向前遍历,找到单词的起始位置(即首个不是空格的字符) while (i >= 0 && s.charAt(i) != ' ') i--; // 将从i+1到j的子字符串(即一个单词)添加到结果中,并在其后添加一个空格 // 注意:i+1是单词的起始位置,j+1会超出范围,因此使用j res.append(s.substring(i + 1, j + 1) + " "); // 跳过单词间的空格,继续寻找下一个单词的起始位置 while (i >= 0 && s.charAt(i) == ' ') i--; // 更新j为下一个单词的尾字符索引 j = i; } // 将StringBuilder对象res转换为字符串,并删除结果字符串的首尾空格,然后返回 return res.toString().trim(); }
}
6.【中等】Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
- 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
- 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
请你实现这个将字符串进行指定行数变换的函数:
示例 :
- 输入:s = “PAYPALISHIRING”, numRows = 4
- 输出:“PINALSIGYAHRPI”
- 解释:
class Solution { public String convert(String s, int numRows) { // 如果numRows小于2,说明无需转换,直接返回原字符串 if(numRows < 2) return s; // 创建一个ArrayList,用于存储每一行的StringBuilder对象 List<StringBuilder> rows = new ArrayList<StringBuilder>(); // 初始化每一行的StringBuilder对象 for(int i = 0; i < numRows; i++) rows.add(new StringBuilder()); // i表示当前字符应该放在哪一行 // flag表示i的移动方向,初始化为-1表示向下移动 int i = 0, flag = -1; // 遍历字符串s中的每一个字符 for(char c : s.toCharArray()) { // 将字符添加到对应的行中 rows.get(i).append(c); // 如果当前行是第一行或者最后一行,则改变移动方向 if(i == 0 || i == numRows - 1) flag = - flag; // 根据flag的值更新i的值,实现Z字形遍历 i += flag; } // 创建一个StringBuilder对象res,用于构建结果字符串 StringBuilder res = new StringBuilder(); // 遍历所有行,将每一行的内容添加到res中 for(StringBuilder row : rows) res.append(row); // 将res转换为字符串并返回 return res.toString(); }
}
68.【困难】文本左右对齐
- 给定一个单词数组 words 和一个长度 maxWidth ,重新排版单词,使其成为每行恰好有 maxWidth 个字符,且左右两端对齐的文本。
- 你应该使用 “贪心算法” 来放置给定的单词;也就是说,尽可能多地往每行中放置单词。必要时可用空格 ’ ’ 填充,使得每行恰好有 maxWidth 个字符。
- 要求尽可能均匀分配单词间的空格数量。如果某一行单词间的空格不能均匀分配,则左侧放置的空格数要多于右侧的空格数。
- 文本的最后一行应为左对齐,且单词之间不插入额外的空格。
注意:
- 单词是指由非空格字符组成的字符序列。
- 每个单词的长度大于 0,小于等于 maxWidth。
- 输入单词数组 words 至少包含一个单词。
示例 :
- 输入:words = [“Science”,“is”,“what”,“we”,“understand”,“well”,“enough”,“to”,“explain”,“to”,“a”,“computer.”,“Art”,“is”,“everything”,“else”,“we”,“do”],maxWidth = 20
- 输出:
[
“Science is what we”,
“understand well”,
“enough to explain to”,
“a computer. Art is”,
“everything else we”,
"do "
]
class Solution {// 主要方法,用于实现单词的完全对齐功能public List<String> fullJustify(String[] words, int maxWidth) {List<String> ans = new ArrayList<String>(); // 初始化结果列表int right = 0, n = words.length; // 初始化指向当前行第一个单词的指针(right)及单词总数(n)// 循环处理每一行,直到所有单词被分配while (true) {int left = right; // 当前行的第一个单词在 words 的位置int sumLen = 0; // 统计这一行单词长度之和// 找出当前行可以容纳的单词,确保单词总长度加上空格不超过 maxWidthwhile (right < n && sumLen + words[right].length() + right - left <= maxWidth) {sumLen += words[right++].length(); // 累加单词长度并移动右指针}// 如果右指针到达末尾,说明处理的是最后一行if (right == n) {StringBuffer sb = join(words, left, n, " "); // 将剩余单词左对齐拼接,单词间单空格sb.append(blank(maxWidth - sb.length())); // 在行末填充空格以达到 maxWidthans.add(sb.toString()); // 添加到结果列表并返回return ans;}// 计算当前行的单词数和所需空格数int numWords = right - left;int numSpaces = maxWidth - sumLen;// 如果当前行只有一个单词,左对齐并在后面填充空格if (numWords == 1) {StringBuffer sb = new StringBuffer(words[left]);sb.append(blank(numSpaces)); // 在单词后添加足够的空格ans.add(sb.toString());continue;}// 多单词行处理int avgSpaces = numSpaces / (numWords - 1); // 平均每个空格数量int extraSpaces = numSpaces % (numWords - 1); // 额外的空格// 拼接单词,先拼接带有额外空格的单词,再拼接其余单词StringBuffer sb = new StringBuffer();sb.append(join(words, left, left + extraSpaces + 1, blank(avgSpaces + 1))); sb.append(blank(avgSpaces)); // 添加平均数量的空格sb.append(join(words, left + extraSpaces + 1, right, blank(avgSpaces)));ans.add(sb.toString()); // 添加到结果列表}}// 辅助方法,生成指定数量的空格字符串public String blank(int n) {StringBuffer sb = new StringBuffer();for (int i = 0; i < n; ++i) {sb.append(' ');}return sb.toString();}// 辅助方法,使用指定分隔符连接 words 中指定范围的单词public StringBuffer join(String[] words, int left, int right, String sep) {StringBuffer sb = new StringBuffer(words[left]);for (int i = left + 1; i < right; ++i) {sb.append(sep);sb.append(words[i]);}return sb;}
}
167.【中等】两数之和 II - 输入有序数组
- 给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
- 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。
- 你可以假设每个输入 只对应唯一的答案 ,而且你 不可以 重复使用相同的元素。
- 你所设计的解决方案必须只使用常量级的额外空间。
public int[] twoSum(int[] numbers, int target) { // 初始化两个指针,一个指向数组的开头,一个指向数组的末尾 int i = 0; int j = numbers.length - 1; // 当两个指针没有相遇时,执行循环 while (i < j) { // 计算当前两个指针所指向的元素之和 int sum = numbers[i] + numbers[j]; // 如果和小于目标值,则移动左指针向右 if (sum < target) { i++; } // 如果和大于目标值,则移动右指针向左 else if (sum > target) { j--; } // 如果和等于目标值,则返回两个指针的索引(注意这里索引从1开始,所以加1) else { return new int[]{i+1, j+1}; } } // 如果循环结束仍未找到满足条件的两个数,则返回{-1, -1} return new int[]{-1, -1};
}
相关文章:

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。
文章目录 12.【中等】整数转罗马数字151.【中等】反转字符串中的单词6.【中等】Z 字形变换68.【困难】文本左右对齐167.【中等】两数之和 II - 输入有序数组 🌈你好呀!我是 山顶风景独好 💝欢迎来到我的博客,很高兴能够在这里和您…...

SwiftUI中AppStorage的介绍使用
在Swift中,AppStorage是SwiftUI中引入的一个属性包装器,在这之前我们要存储一些轻量级的数据采用UserDefaults进行存取。而AppStorage用于从UserDefaults中读取值,当值改变时,它会自动重新调用视图的body属性。也就是说࿰…...

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机
概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具,但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此,…...

知识点总结
1、Uboot的流程调用: 1.1、cmd_process函数是怎么被调用到的: cmd_process在common/command.c 1.2、uboot阶段断电,后续起不来,可能要换线去使用,也许和电源线有关 2、git 相关使用 2.1 .gitignore相关的使用 1、…...

Python并发与异步编程
Python的并发与异步编程是两个不同的概念,但它们经常一起使用,以提高程序的性能和响应能力。以下是对这两个概念的详细讲解: 并发编程 (Concurrency) 并发编程是指在程序中同时执行多个任务的能力。Python提供了几种实现并发的机制ÿ…...

动态内存管理—C语言通讯录
目录 一,动态内存函数的介绍 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的内存开辟 二,通讯录管理系统 动态内存函数的介绍 malloc free calloc realloc 一,动态内存函数的介绍 1.1 malloc和free void* malloc (…...

美光EMMC芯片丝印型号查询 8LK17/D9PSK, OXA17/JY997
问题说明 最近在使用美光EMMC的时候,发现通过芯片丝印查询不到 芯片的规格说明书; 经过查阅资料,发现美光的EMMC芯片 “由于空间限制,FBGA 封装组件具有与部件号不同的缩写部件标记”,需要通过官网查询丝印的FBGA cod…...

win32-鼠标消息、键盘消息、计时器消息、菜单资源
承接前文: win32窗口编程windows 开发基础win32-注册窗口类、创建窗口win32-显示窗口、消息循环、消息队列 本文目录 键盘消息键盘消息的分类WM_CHAR 字符消息 鼠标消息鼠标消息附带信息 定时器消息 WM_TIMER创建销毁定时器 菜单资源资源相关菜单资源使用命令消息的…...

springboot项目部署到linux服务器
springboot后端 修改前 修改后 vue前端 修改前 将地址中的 localhost改为 ip 重新生成war包 war上传到linux的tomcat的webapps下 其他环境配置和macOS大差不差 Tomcat安装使用与部署Web项目的三种方法_tomcat部署web项目-CSDN博客...

MagicLens:新一代图像搜索技术和产品形态
MagicLens:Self-Supervised Image Retrieval with Open-Ended Instructions MagicLens: 自监督图像检索与开放式指令 作者:Kai Zhang, Yi Luan, Hexiang Hu, Kenton Lee, Siyuan Qiao, Wenhu …...

[9] CUDA性能测量与错误处理
CUDA性能测量与错误处理 讨论如何通过CUDA事件来测量它的性能如何通过CUDA代码进行调试 1.测量CUDA程序的性能 1.1 CUDA事件 CPU端的计时器可能无法给出正确的内核执行时间CUDA事件等于是在你的CUDA应用运行的特定时刻被记录的时间戳,通过使用CUDA事件API&#…...

Java学习四
Random 随机数 数组 静态初始化数组 数组在计算机中的基本原理 数组的访问 什么是遍历 数组的动态初始化 动态初始化数组元素默认值规则 Java内存分配介绍 数组在计算机中的执行原理 使用数组时常见的一个问题 案例求数组元素最大值 public class Test1 {public static void ma…...

Vue 父组件使用refs来直接访问和修改子组件的属性或调用子组件的方法
步骤 1: 在子组件中定义要被修改的属性或方法 首先,在子组件中定义你想要父组件能够修改或调用的属性或方法。例如,我们有一个名为MyChildComponent的子组件,它有一个名为childData的数据属性和一个名为updateData的方法。 // 子组件 MyChi…...

范罗士、希喂、安德迈爆款宠物空气净化器哪款好?深度对比测评
作为一名深受养猫过敏困扰的铲屎官,我经常提醒新手铲屎官重视家里的空气环境。宠物的浮毛和皮屑不仅会引发过敏,还可能传播细菌和病毒。很多人以为普通空气净化器能解决问题,但这些产品并未针对宠物家庭的特殊需求。经过多次研究和测试&#…...

SAP OBYC自动记账 详解
在MM模块的许多操作都能实现在FI模块自动过账,如PO收货、发票验证、工单发料、向生产车间发料等等。不用说,一定需要在IMG中进行配置才可以实现自动处理。但SAP实现的这种自动配置的机制是怎样的呢?其实也并不复杂,让我们先以一种最简单的情况来了解实现原理和实现流程,然…...

《NoSQL数据库技术与应用》 MongoDB副本集
《NoSQL数据库技术与应用》 教学设计 课程名称:NoSQL数据库技术与应用 授课年级: 20xx年级 授课学期: 20xx学年第一学期 教师姓名: 某某老师 2020年5月6日 课题 名称 第4章 MongoDB副本集 计划学时 8课时 内容 分析 独立模式可…...

Flutter 中的 DropdownButtonFormField 小部件:全面指南
Flutter 中的 DropdownButtonFormField 小部件:全面指南 在Flutter中,DropdownButtonFormField是一个特殊的表单字段小部件,它结合了下拉选择框(DropdownButton)和表单字段(FormField)的功能。…...

哈希算法教程(个人总结版)
背景 哈希算法(Hash Algorithm)是一种将任意长度的输入(也称为消息)转换为固定长度的输出(也称为哈希值、散列值、摘要)的算法。哈希算法在计算机科学中有着广泛的应用,包括数据存储、数据检索…...

Nocobase快速上手 -第一个collection
本文记录Nocobase中如何创建collection,以及如何将collection展示到页面中,并且配置CRUD相应的操作. Collection 在NocoBase中,collection(集合)是用来组织和存储各种数据的容器,如订单、产品、用户、评论…...

吴恩达2022机器学习专项课程C2W2:2.19 sigmoid函数的替代方案 2.20如何选择激活函数 2.21 激活函数的重要性
这里写目录标题 引言sigmoid激活函数的局限1.回顾需求案例2.ReLU激活函数 常用的激活函数1.线性激活函数的解释 如何选择激活函数?1.选择输出层的激活函数2.选择隐藏层的激活函数 选择激活函数的总结1.输出层总结2.隐藏层总结3.TensorFlow设置激活函数 激活函数多样…...

循序渐进Docker Compose
文章目录 1.概述1.1 Docker Compose 定义1.2 Docker Compose背景1.3 Docker Compose核心概念 2.安装2.1 Official Repos2.2 Manual Installation2.3 v1.x 兼容性 3. YAML 配置说明3.1 Services3.2 Volumes & Networks 4. 解析 Service4.1 Pulling一个Image4.2 Building一个…...

怎样查看JavaScript中没有输出结果的数组值?
在JavaScript中,可以方便地定义和使用数组,对于已经定义的数组,怎样查看其值呢? 看下面的示例,并运行它。 上面的示例中,标签不完整,请补充完整再试运行。你知道少了什么标签么? 注…...

强化学习学习笔记-李宏毅
Policy Gradient actorenvreward function,env和reward是不能控制的,唯一可以变的是actor,Policy π \pi π是一个网络,参数为 θ \theta θ,输入是当前的观察,输出是采取的行为,例如游戏中输…...

吴恩达深度学习笔记:超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter tuning)3.8-3.9
目录 第二门课: 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第三周: 超 参 数 调 试 、 Batch 正 则 化 和 程 序 框 架(Hyperparameter …...

SQL 语言:数据控制
文章目录 概述授权(GRANT)销权(REVOKE)总结 概述 SQL语言中的数据控制权限分配是数据库管理的重要组成部分,它涉及到如何合理地为用户分配对数据库资源的访问和使用权限。 权限类型:在SQL中,权限主要分为…...

『ZJUBCA Weekly Feed 07』MEV | AO超并行计算机 | Eigen layer AVS生态
一文读懂MEV:区块链的黑暗森林法则 01 💡TL;DR 这篇文章介绍了区块链中的最大可提取价值(MEV)概念,MEV 让矿工和验证者通过抢先交易、尾随交易和三明治攻击等手段获利,但也导致网络拥堵和交易费用增加。为了…...

正点原子延时函数delay_ms延时失效的原因
1、问题陈述 今天在测试小车程序的时候使用了如下代码,发现延时并没有达到期望的4s,而是仅仅延时了0.4s左右,本来以为少加了个0,最后在我多次测试下来,发现在延时大约超过2s的时候就会失效。 while(1){Set_Pwm(6000,60…...

MySQL 满足条件函数中使用查询最大值函数
在实际的数据库操作中,我们常常需要根据某些条件找到最大值并据此进行下一步的操作。例如,在一个包含订单信息的表中,可能需要找到特定客户的最大订单金额,并据此进行某些统计或决策。MySQL 提供了多种函数和查询方法,…...

Java | Leetcode Java题解之第101题对称二叉树
题目: 题解: class Solution {public boolean isSymmetric(TreeNode root) {return check(root, root);}public boolean check(TreeNode u, TreeNode v) {Queue<TreeNode> q new LinkedList<TreeNode>();q.offer(u);q.offer(v);while (!q.…...

【区块链】智能合约漏洞测试
打开Ganache vscode打开智能合约漏洞工程 合约内容 pragma solidity >0.8.3;contract EtherStore {mapping(address > uint) public balances;function deposit() public payable {balances[msg.sender] msg.value;emit Balance(balances[msg.sender]);}function with…...