【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录

    • 12.【中等】整数转罗马数字
    • 151.【中等】反转字符串中的单词
    • 6.【中等】Z 字形变换
    • 68.【困难】文本左右对齐
    • 167.【中等】两数之和 II - 输入有序数组

🌈你好呀!我是 山顶风景独好
💝欢迎来到我的博客,很高兴能够在这里和您见面!
💝希望您在这里可以感受到一份轻松愉快的氛围!
💝不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

12.【中等】整数转罗马数字

七个不同的符号代表罗马数字,其值如下:

罗马符号数值
I1
V5
X10
L50
C100
D500
M1000
组合符号数值示例
IV41 (I) 减去 1 (V) 的值
IX91 (I) 减去 10 (X) 的值
XL4010 (X) 减去 1 (L) 的值
XC9010 (X) 减去 100 © 的值
CD400100 © 减去 1 (D) 的值
CM900100 © 减去 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};  
}

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

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

相关文章

基于YOLO系列算法(YOLOv5、YOLOv6、YOLOv8以及YOLOv9)和Streamlit框架的行人头盔检测系统

摘要 本文基于最新的基于深度学习的目标检测算法 (YOLOv5、YOLOv6、YOLOv8)以及YOLOv9) 对头盔数据集进行训练与验证&#xff0c;得到了最好的模型权重文件。使用Streamlit框架来搭建交互式Web应用界面&#xff0c;可以在网页端实现模型对图像、视频和实时摄像头的目标检测功能…

网络考试系统的设计与实现参考论文(论文 + 源码)

网络考试系统的设计与实现 摘 要 科技在进步&#xff0c;人们生活和工作的方式正发生着改变&#xff0c;不仅体现在人们的衣食住行&#xff0c;也体现在与时俱进的考试形式上。以前的考试需要组织者投入大量的时间和精力&#xff0c;需要对考试的试题进行筛选&#xff0c;对后期…

变量命名的艺术:从蛇形到驼峰

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、蛇形命名法的魅力 二、类名和模块名的特殊规则 三、驼峰命名法的魅力与挑战 四、保持…

DLRover:蚂蚁集团开源的AI训练革命

在当前的深度学习领域&#xff0c;大规模训练作业面临着一系列挑战。首先&#xff0c;硬件故障或软件错误导致的停机时间会严重影响训练效率和进度。其次&#xff0c;传统的检查点机制在大规模训练中效率低下&#xff0c;耗时长且容易降低训练的有效时间。资源管理的复杂性也给…

新建项目上传gitee

1.在项目根目录下打开黑窗口执行初始化 git init2.复制码云上新建仓库地址 3.本地仓库和远程仓库建立连接 远程仓库地址是之前复制的仓库地址&#xff0c;复制后直接在命令窗口中鼠标右键Paste即可在命令窗口粘贴出来 git remote add origin 远程仓库地址4.每次上传之前先更…

【嵌入式软件工程师面经】Socket,TCP,HTTP之间的区别

目录&#xff1a; 目录 目录&#xff1a; 一、Socket原理与TCP/IP协议 1.1 Socket概念&#xff1a; 1.2 建立Socket连接&#xff1a; 1.3 SOCKET连接与TCP/IP连接 二、HTTP连接&#xff1a; 2.1 HTTP原理 三、三者的区别和联系 前些天发现了一个巨牛的人工智能学习网站&#xf…

头歌openGauss-存储过程第1关:创建存储过程

编程要求 1、创建第1个存储过程&#xff0c;并调用&#xff1b; 1&#xff09;创建存储过程&#xff0c;查询emp表数据&#xff1b; 2&#xff09;调用存储过程&#xff1b; --创建存储过程&#xff0c;获得计算机&#xff08;cs&#xff09;系学生选课情况并将结果写入临时表t…

Excel插入多行VBA实现

我们还可以利用 VBA&#xff08;Visual Basic for Applications&#xff09;宏语言&#xff0c;在 Excel 中写一个 VBA 宏来自动插入多行数据。这种方法可以方便我们自定义需要插入的行数和插入位置。下面是编写 VBA 宏的步骤&#xff1a; 1、按下Alt F11快捷键&#xff0c;打…

JavaScript表达式和运算符

表达式 表达式一般由常量、变量、运算符、子表达式构成。最简单的表达式可以是一个简单的值。常量或变量。例&#xff1a;var a10 运算符 运算符一般用符号来表示&#xff0c;也有些使用关键字表示。运算符由3中类型 1.一元运算符&#xff1a;一个运算符能够结合一个操作数&…

忍の摸头之术游戏娱乐源码

本资源提供给大家学习及参考研究借鉴美工之用&#xff0c;请勿用于商业和非法用途&#xff0c;无任何技术支持&#xff01; 忍の摸头之术游戏娱乐源码&#xff0c;抖音上面非常火的摸头杀画面,看得我眼花缭乱,源码拿去玩吧&#xff1b; 目录说明 忍の摸头之术&#xff1a;域…

物理服务器介绍

物理服务器介绍 概述分类按服务器应用分类按服务器结构分类塔式服务器机架式服务器刀片式服务器机架式服务器与刀片式服务器的对比按处理器个数分类按处理器架构分类 主板概述工作原理物理结构技术参数 CPU概述工作原理指令集相关技术技术参数主流产品 内存概述类型相关技术技术…

【linux特殊符号】

文章目录 学习目标一、Linux的特殊符号1.系统变量2.引号 总结 学习目标 1.学会查看系统变量 2.学会各种引号 3.一、Linux的特殊符号 1.系统变量 windows系统变量&#xff1a;echo %path% linux系统变量&#xff1a;echo $PATH2.引号 " " 双引号&#xff0c;换行…

Vue3路由配置

路由其实就是一组对应关系&#xff0c;将一个路径与一个组件对应起来&#xff0c;当路径发生变化&#xff0c;路由器就可以通过路由规则&#xff0c;找到当前路径对应的组件&#xff0c;并将该组件呈现到页面上 使用路由步骤&#xff1a; 1.终端输入 npm i vue-router 2.在App…

解耦:哪些方法可以用来解耦代码

目录 1.引用 2.为何解耦如此重要 3.如何判断代码是否需要解耦 4.如何给代码解耦 5.思考题 1.引用 前面我们曾经讲到&#xff0c;重构可以分为大型重构和小型重构。小型重构的主要目的是提高代码的可读性&#xff0c;大型重构的主要目的是解耦。本节讲解如何对代码进行解耦…

es问题汇总--待完善

1. 查询某个索引库中数据总量 方式一&#xff1a; CountRequest 鄙人喜欢这种方式 public long getTotalNum(String indexName) throws IOException {CountRequest countRequest new CountRequest(indexName);// 如果需要&#xff0c;你可以在这里添加查询条件// countReques…

MySQL之架构设计与历史(一)

架构设计与历史 概述 和其他数据库系统相比&#xff0c;MySQL有点与众不同&#xff0c;它的架构可以在多种不同场景中应用并发挥好的作用&#xff0c;但同时也会带来一点选择上的困难。MySQL并不完美&#xff0c;却足够灵活&#xff0c;能够适应高要求的环境&#xff0c;例如…

【全开源】班级管家微信小程序(FastAdmin+ThinkPHP)

班级管家微信小程序 班级管家微信小程序&#xff0c;作为一款专注于家校沟通、作业管理、成绩发布等方面的工具&#xff0c;凭借其丰富的特色功能和显著的优势&#xff0c;已经成为广大教师、家长和学生日常学习生活中不可或缺的一部分。 一、特色功能 家校沟通便捷&#xff…

高效利用键盘上的 caps lock(大写键)实现中英切换

先看效果 在中文输入环境中&#xff0c;Caps Lock 键经常被忽视&#xff0c;占据了键盘上的黄金位置却很少派上用场。接下来&#xff0c;我将介绍如何将这个闲置的键合理利用&#xff0c;让它变得更加实用。 第一步 设置&#xff1a; 我以五笔为例&#xff1a; 1.输入法默认…

CCF20230301——田地丈量

CCF20230301——田地丈量 代码如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int n,a,b;cin>>n>>a>>b;int x1,x2,y1,y2,x,y,sum0;for(int i0;i<n;i){cin>>x1>>y1>>x2>>y2;xmin(x2,a)-max(x1,…

基础3 探索JAVA图形编程桌面:逻辑图形组件实现

在一个宽敞明亮的培训教室里&#xff0c;阳光透过窗户柔和地洒在地上&#xff0c;教室里摆放着整齐的桌椅。卧龙站在讲台上&#xff0c;面带微笑&#xff0c;手里拿着激光笔&#xff0c;他的眼神中充满了热情和期待。他的声音清晰而洪亮&#xff0c;传遍了整个教室&#xff1a;…