当前位置: 首页 > news >正文

数组题目总结 -- 花式遍历

目录

  • 一. 反转字符串中的单词
    • 思路和代码:
      • I. 博主的做法
      • II. 东哥的做法
      • III. 其他做法1
        • 补充知识点:
      • IV. 其他做法2
  • 二. 旋转图像
    • 思路和代码:
      • I. 博主的做法
      • II. 东哥的做法
  • 三. 旋转图像(逆时针旋转90°)
    • 思路和代码:
      • I. 博主和东哥的做法
  • 四. 矩阵的螺旋遍历
    • 思路和代码:
      • I. 博主的做法
      • II. 东哥的做法
  • 五. 构建螺旋矩阵
    • 思路和代码:
      • I. 博主的做法
      • II. 东哥的做法

一. 反转字符串中的单词

  • 题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/

思路和代码:

I. 博主的做法

  • 先用trim()方法把字符串前后的多余空格全部去掉。
  • 再用replaceAll(“\\s+”, " ");把多个空格替换成一个空格,\s代表空格,+代表多个。
  • 用split以空格为标志,切分字符串,放到字符串数组中。
  • 之后使用StringBuffer反向存储。
class Solution {public String reverseWords(String s) {s = s.trim().replaceAll("\\s+", " ");String[] temp = s.split(" ");StringBuffer stb = new StringBuffer();for(int i = temp.length-1; i > 0; i--){stb.append(temp[i] + " ");}stb.append(temp[0]);return stb.toString();}
}
  • 申请了额外的空间,原地反转,博主不会,,,
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

II. 东哥的做法

  • 先反转整个字符串。
  • 然后反转每一个单词。
    在这里插入图片描述
class Solution {public StringBuilder trimSpace(String s){int left = 0, right = s.length()-1;//去除开头和结尾的空格while(left <= right && s.charAt(left) == ' ')left++;while(left <= right && s.charAt(right) == ' ')right--;//去除字符串中间的空格StringBuilder stb1 = new StringBuilder();while(left <= right){if(s.charAt(left) != ' ')stb1.append(s.charAt(left));else if(stb1.charAt(stb1.length()-1) != ' ')stb1.append(s.charAt(left));left++;}return stb1;}//写的挺巧妙的反转函数,可以积累public void reverse(StringBuilder stb, int left, int right){while (left < right) {char temp = stb.charAt(left);stb.setCharAt(left++, stb.charAt(right));   stb.setCharAt(right--, temp);}}public void reverseWord(StringBuilder stb){int start = 0, end = 0;while(start < stb.length()){while(end < stb.length() && stb.charAt(end) != ' ')end++;reverse(stb, start, end-1);//寻找下一个单词start = end + 1;end++;} }//总函数public String reverseWords(String s) {StringBuilder stb = trimSpace(s);//StringBuilder 不用再加返回值,直接就在原地操作了reverse(stb, 0, stb.length()-1);reverseWord(stb);return stb.toString();}
}
  • StringBuilder一定要定义在循环外面,循环里面的属于临时变量,外面的函数是调用不了的。
  • 如果是StringBuilder,就不用再有返回值,因为StringBuilder是可变的,而java中String是不可变的,需要额外申请空间进行操作。C++中,String是可变的,所以空间复杂度能降到O(1),不需要额外申请空间。
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

III. 其他做法1

  • 去除开头和末尾的空格。
  • 运用正则表达式将字符串分成一个一个的单词(用一个或者多个空格当做分隔符),返回的数组转换成List。
  • 反转List,相当于将单词的顺序做一个反转。
  • 将空格加入到List当中。
class Solution {public String reverseWords(String s) {// 除去开头和末尾的空白字符s = s.trim();// 正则匹配连续的空白字符作为分隔符分割List<String> wordList = Arrays.asList(s.split("\\s+"));Collections.reverse(wordList);return String.join(" ", wordList);}
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

补充知识点:

  • 在Java 8及以上版本中,String.join()方法最后一个参数可以传入任何对象类型的可迭代集合.
  • 可迭代集合就是实现Iterable接口的集合,看下图:
    在这里插入图片描述
  • 需要注意的是:Java中数组也实现了Iterable接口,也就是,数组也可以通过join方法,返回字符串

IV. 其他做法2

  • 去掉头尾两头的空格
  • 将字符串加入双端队列的头部或者直接加入栈中,如下图:
    在这里插入图片描述
class Solution {public String reverseWords(String s) {int left = 0, right = s.length()-1;//去掉前后两头的空格while(left <= right && s.charAt(left) == ' ')left++;while(left <= right && s.charAt(right) == ' ')right--;//使用双端队列存字符串,使用StringBuilder来存单词Deque<String> deque = new ArrayDeque<>();StringBuilder stb = new StringBuilder();while(left <= right){//如果StringBuilder中不为空(单词存在),并且遇到下一个空格了,就从头部加入双端队列并清空StringBuilderif(stb.length() != 0 && s.charAt(left) == ' '){deque.offerFirst(stb.toString());stb.setLength(0);}else if(s.charAt(left) != ' ')stb.append(s.charAt(left));left++;}//记得加入最后一个单词,因为遇不到下一个空格了!!!   deque.offerFirst(stb.toString());return String.join(" ", deque);}
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

二. 旋转图像

  • 题目链接:https://leetcode.cn/problems/rotate-image/

思路和代码:

I. 博主的做法

  • 博主只能想到一圈一圈的进行迭代数组。。。太复杂了。

II. 东哥的做法

  • 先将矩阵沿对角线,做对称矩阵操作

在这里插入图片描述

  • 对矩阵的每一行进行反转
    在这里插入图片描述
    在这里插入图片描述
class Solution {//以对角线对称交换矩阵public void symmetry(int[][] matrix){for(int i = 0; i < matrix.length; i++)for(int j = 0; j < i; j++){int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;}}//将每一行进行反转public void reverse(int[] num){int left = 0, right = num.length-1;while(left <= right){int temp = num[left];num[left++] = num[right];num[right--] = temp;}}public void rotate(int[][] matrix) {symmetry(matrix);for(int[] n : matrix)reverse(n);}
}
  • 常规的思路就是去寻找原始坐标和旋转后坐标的映射规律,但我们是否可以让思维跳跃跳跃,尝试把矩阵进行反转、镜像对称等操作,可能会出现新的突破口。
  • 仔细想想,旋转二维矩阵的难点在于将「行」变成「列」,将「列」变成「行」,而只有按照对角线的对称操作是可以轻松完成这一点的,对称操作之后就很容易发现规律了。

三. 旋转图像(逆时针旋转90°)

  • 题目链接:无。
  • 函数名: public void rotate(int[][] matrix){ }

思路和代码:

I. 博主和东哥的做法

  • 和上一道题真的很像,就是沿着另一条对角线旋转,然后反转每一行。
    在这里插入图片描述
package 洛谷;import java.util.Scanner;public class Test {//沿逆对角线进行对称public static void romate(int[][] matrix){for(int i = 0; i < matrix.length; i++)for(int j = 0; j < matrix.length-i; j++){int temp = matrix[i][j];matrix[i][j] = matrix[matrix.length - 1 - j][matrix.length - 1 - i];matrix[matrix.length - 1 - j][matrix.length - 1 - i] = temp;}}//每行进行反转public static void reverse(int[] matrix){int left = 0, right = matrix.length-1;while(left <= right){int temp = matrix[left];matrix[left++] = matrix[right];matrix[right--] = temp;}}//主函数public static void main(String[] args){Scanner sc = new Scanner(System.in);int[][] a = {{1,2,3,4}, {5,6,7,8}, {7,6,5,4},{4,1,2,3}};romate(a);for(int[] num : a)reverse(num);for(int i = 0; i < a.length; i++){for(int j = 0; j < a.length; j++)System.out.print(a[i][j] + " ");System.out.println();}}}
  • 顺逆对角线对称的逻辑还是不太会,仍需加强

四. 矩阵的螺旋遍历

  • 题目链接:https://leetcode.cn/problems/spiral-matrix/

思路和代码:

I. 博主的做法

  • 设置4个边界,然后模拟顺序输出的样子,进行遍历
class Solution {public List<Integer> spiralOrder(int[][] matrix) {int top = 0, left = 0, right = matrix[0].length-1, bottom = matrix.length-1;List<Integer> list = new ArrayList<>();while(left <= right && top <= bottom){for(int j = left; top <= bottom && j <= right; j++)list.add(matrix[top][j]);top++;for(int i = top; left <= right && i <= bottom; i++)list.add(matrix[i][right]);right--;for(int j = right; top <= bottom && j >= left; j--)list.add(matrix[bottom][j]);bottom--;for(int i = bottom; left <= right && i >= top; i--)list.add(matrix[i][left]);left++;}return list;}
}
  • 这一行写成:for(int j = left; left <= right && j <= right; j++),这显然是错的,j <= right已经判断过了;其次,如果上下都是负的空间,左右又有什么意义呢??
  • 还需要注意,螺旋输出,没拐个弯,对应的边界就要多走一格子。
  • 列的个数一定是matrix[0].length - 1,行的个数是matrix.length

II. 东哥的做法

  • 和博主想的一样,设置四个边界
List<Integer> spiralOrder(int[][] matrix) {int m = matrix.length, n = matrix[0].length;int upper_bound = 0, lower_bound = m - 1;int left_bound = 0, right_bound = n - 1;List<Integer> res = new LinkedList<>();// res.size() == m * n 则遍历完整个数组while (res.size() < m * n) {if (upper_bound <= lower_bound) {// 在顶部从左向右遍历for (int j = left_bound; j <= right_bound; j++) {res.add(matrix[upper_bound][j]);}// 上边界下移upper_bound++;}if (left_bound <= right_bound) {// 在右侧从上向下遍历for (int i = upper_bound; i <= lower_bound; i++) {res.add(matrix[i][right_bound]);}// 右边界左移right_bound--;}if (upper_bound <= lower_bound) {// 在底部从右向左遍历for (int j = right_bound; j >= left_bound; j--) {res.add(matrix[lower_bound][j]);}// 下边界上移lower_bound--;}if (left_bound <= right_bound) {// 在左侧从下向上遍历for (int i = lower_bound; i >= upper_bound; i--) {res.add(matrix[i][left_bound]);}// 左边界右移left_bound++;}}return res;
}
  • 思路是一样的,大家看着哪个顺眼参考哪个

五. 构建螺旋矩阵

  • 题目链接:https://leetcode.cn/problems/spiral-matrix-ii/

思路和代码:

I. 博主的做法

  • 跟上个题几乎是一模一样,只是在每次循环当中进行的操作不同而已。
class Solution {public int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int top = 0, left = 0, right = n-1, bottom = n-1;int num = 1;while(top <= bottom && left <= right){for(int j = left; top <= bottom && j <= right; j++)//这里不一样,下面同理matrix[top][j] = num++;top++;for(int i = top; left <= right && i <= bottom; i++)matrix[i][right] = num++;right--;for(int j = right; top <= bottom && j >= left; j--)matrix[bottom][j] = num++;bottom--;for(int i = bottom; left <= right && i >= top; i--)matrix[i][left] = num++;left++;}return matrix;}
}
  • 时间复杂度:O(n^2),其中 n 是给定的正整数。矩阵的大小是 n×n,需要填入矩阵中的每个元素。
  • 空间复杂度:O(1),除了返回的矩阵以外,空间复杂度是常数。

II. 东哥的做法

  • 和博主想的一样,设置四个边界
int[][] generateMatrix(int n) {int[][] matrix = new int[n][n];int upper_bound = 0, lower_bound = n - 1;int left_bound = 0, right_bound = n - 1;// 需要填入矩阵的数字int num = 1;while (num <= n * n) {if (upper_bound <= lower_bound) {// 在顶部从左向右遍历for (int j = left_bound; j <= right_bound; j++) {matrix[upper_bound][j] = num++;}// 上边界下移upper_bound++;}if (left_bound <= right_bound) {// 在右侧从上向下遍历for (int i = upper_bound; i <= lower_bound; i++) {matrix[i][right_bound] = num++;}// 右边界左移right_bound--;}if (upper_bound <= lower_bound) {// 在底部从右向左遍历for (int j = right_bound; j >= left_bound; j--) {matrix[lower_bound][j] = num++;}// 下边界上移lower_bound--;}if (left_bound <= right_bound) {// 在左侧从下向上遍历for (int i = lower_bound; i >= upper_bound; i--) {matrix[i][left_bound] = num++;}// 左边界右移left_bound++;}}return matrix;
}

参考:
https://labuladong.github.io/algo/di-yi-zhan-da78c/shou-ba-sh-48c1d/er-wei-shu-150fb/
https://leetcode.cn/problems/reverse-words-in-a-string/solution/fan-zhuan-zi-fu-chuan-li-de-dan-ci-by-leetcode-sol/

相关文章:

数组题目总结 -- 花式遍历

目录 一. 反转字符串中的单词思路和代码&#xff1a;I. 博主的做法II. 东哥的做法III. 其他做法1补充知识点&#xff1a; IV. 其他做法2 二. 旋转图像思路和代码&#xff1a;I. 博主的做法II. 东哥的做法 三. 旋转图像&#xff08;逆时针旋转90&#xff09;思路和代码&#xff…...

Android 12.0开机过滤部分通知声音(莫名其妙的通知声音)

1.概述 在12.0的开发产品的时候,有时候在开机的时候会有一些通知的声音,但是由于系统模块太多,也搞不清楚到底是哪个模块发出的通知声音,所以就需要从通知的流程来屏蔽这些通知声音 2.开机过滤部分通知声音(莫名其妙的通知声音)核心代码 frameworks/base/core/java/androi…...

LeetCode-0525

102. 二叉树的层序遍历&#xff08;中等&#xff09; 思路&#xff1a;使用hash记录深度 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if(rootnull)return new ArrayList<>();Map<TreeNode,Integer> deep new HashMap&…...

【Linux 】scp命令

前言 Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的&#xff0c;rcp 是不加密的&#xff0c;scp 是 rcp 的加强版。 scp命令 前言一、示例1. 从本地复制到远程2. 从…...

Docker部署yolov5

目录 环境下载源码构建Docker镜像运行docker镜像运行目标检测出现partially initialized module cv2 has no attribute _registerMatType错误出现ImportError: libSM.so.6: cannot open shared object file: No such file or directory错误出现AttributeError: Upsample object…...

如何在 Axios 中去控制 Loading?大有学问!

目录 前言 按钮loading 局部loading 全局loading 前言 loading 的展示和取消可以说是每个前端对接口的时候都要关心的一个问题。这篇文章将要帮你解决的就是如何结合axios更加简洁的处理loading展示与取消的逻辑。 首先在我们平时处理业务的时候loading一般分为三种&#x…...

充电桩检测设备厂家TK4860C交流充电桩检定装置

TK4860系列是专门针对现有交流充电桩现场检测过程中接线复杂、负载笨重、现场检测效率低等问题而研制的一系列高效检测仪器&#xff0c;旨在更好的开展充电桩的强制检定工作。 充电桩检测设备是一款在交流充电桩充电过程中实时检测充电电量的标准仪器&#xff0c;仪器以新能源…...

一文3000字实现基于Selenium+Python的web自动化测试框架

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefo…...

Android 12系统源码_窗口管理(二)WindowManager对窗口的管理过程

前言 上一篇我们具体分析了窗口管理者WindowManagerService的启动流程,对于WindowManagerService有了一个初步的认识。在此基础上,我本打算应该进一步分析WindowManagerService是如何管理系统中的各种窗口的,然而由于Android系统的架构设计,在分析WindowManagerService之前…...

python3.8,torch1.10.2+cu113、torch-geometric 安装

【1】conda create -n name python=3.8 【2】安装 torch 注意先看可适应的最高cuda版本 https://data.pyg.org/whl/ 版本对应 【3】按照顺序安装torch-geometric: torch-sparse、torch-scatter、torch-cluster、 torch-spline-conv \torch-geometric pip install torc…...

堆(heap)、栈(stack)

在程序中&#xff0c;栈和堆是两种非常重要的数据结构。它们都用来存储数据&#xff0c;但是它们的定义略有不同。 栈Stack: 栈是一种线性的数据结构&#xff0c;它以 “后进先出”&#xff08;LIFO&#xff09;的方式存储数据。栈中的内存空间在编译时就已经确定&#xff0c;大…...

企业级API网关之典型应用场景

目 录 01 企业面对API与网关的现状‍‍‍‍‍ 02 APIGW介绍及企业应用场景 03 总结 01 企业面对API与网关的现状‍ 在企业中&#xff0c;进行新的系统/应用/产品开发时&#xff0c;具有周密的流程&#xff1a;从需求分析、设计、开发、测试、发布与验收。所以&#xff0c;一…...

【2023年4月美赛加赛】Z题:The future of Olympics 25页完整论文

【2023年4月美赛加赛】Z题&#xff1a;The future of Olympics 25页完整论文 1 题目 背景 国际奥委会(IOC)正面临着夏季奥运会和冬季奥运会申办数量的减少**[1]**。在过去&#xff0c;举办奥运会的竞争非常激烈&#xff0c;声望也很高。然而&#xff0c;最近&#xff0c;主办…...

Rocket重试机制,消息模式,刷盘方式

一、Consumer 批量消费&#xff08;推模式&#xff09; Consumer端先启动 Consumer端后启动. 正常情况下&#xff1a;应该是Consumer需要先启动 consumer.setConsumeMessageBatchMaxSize(10);//每次拉取10条 package quickstart; import java.util.List; import co…...

linux+onenet可视化(图形化步骤)

文章目录 一、ONENET项目搭建1.1 ONENET注册1.2 创建产品与设备1.3 添加数据流 二、可视化配置 OneNET是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接&#xff0c;快速完成产品开发部署&#xff0c;为智能硬件、智能家居产品提供完善的物…...

汇编的基础

原视频 基础篇&#xff1a;1.1编程环境的安装 打开DOSBox 0.74-3 Options.bat调整窗口大小 windowresolution1200x640 outputddrawmount c D:\masm c: debugDEBUG 用Debug的R命令查看、改变CPU寄存器的内容&#xff1a; 用Debug的D命令查看内存中的内容&#xff1a; 用Debu…...

并发编程学习(十四):tomcat线程池

1、Tomcat 功能组件结构 Tomcat 的核心功能有两个&#xff0c;分别是负责接收和反馈外部请求的连接器 Connector&#xff0c;和负责处理请求的容器 Container。 其中连接器和容器相辅相成&#xff0c;一起构成了基本的 web 服务 Service。每个 Tomcat 服务器可以管理多个 Servi…...

简洁灵活工单管理系统,支持工单模版字段、工单状态自定义

一、开源项目简介 本项目为FeelDesk工单管理系统的开源版&#xff08;OS&#xff09;&#xff0c;是基于开发者版&#xff08;DEV&#xff09;分离的标准版&#xff1b;支持工单模版字段、工单状态等自定义&#xff0c;可为不同的模版设置不同的路由规则&#xff1b;对工单需求…...

标签派单系统架构设计

需求描述 项目背景 根据员工历史成单情况&#xff0c;计算员工对不同类型工单的转化能力。根据员工和工单标签匹配进行派单。 业务流程图 规则描述 每10分钟&#xff0c;分城进行一次派单&#xff0c;派单规则可能会动态删减&#xff0c;需要支持动态配置 工单标签说明 一…...

Jmeter和Postman那个工具更适合做接口测试?

软件测试行业做功能测试和接口测试的人相对比较多。在测试工作中&#xff0c;有高手&#xff0c;自然也会有小白&#xff0c;但有一点我们无法否认&#xff0c;就是每一个高手都是从小白开始的&#xff0c;所以今天我们就来谈谈一大部分人在做的接口测试&#xff0c;小白变高手…...

k8s污点与容忍

1.前言 污点是给node节点打上污点标签&#xff0c;使得pod不能往该node节点上调度&#xff0c;污点有三种模式&#xff0c;分别是NoSchedule、PreferNoSchedule、NoExecute&#xff0c;容忍是给pod打上和node节点一样的污点标签&#xff0c;使pod能调度到带有该污点标签的node…...

市面上有哪些软件可以结合agentgpt的?众包平台结合的好处!

使用AgentGPT&#xff0c;提升工作效率&#xff01; 随着科技的迅速发展&#xff0c;人工智能已经成为我们生活中不可或缺的一部分。而AgentGPT则是人工智能领域的一款杰出产品&#xff0c;它能够帮助我们提升工作效率&#xff0c;减少重复性劳动&#xff0c;让我们的生活更加便…...

【js】对象属性的拦截和Proxy代理与Reflect映射的用法与区别

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录 对象属性的拦截介绍SetGet 对象的拦截介绍使用对象属性拦截和对象拦截区别练习题 映射…...

Yolov8涨点神器:ODConv+ConvNeXt提升小目标检测能力

1.涨点神器结合,助力YOLO 1.1 ICLR 2022涨点神器——即插即用的动态卷积ODConv 论文:Omni-Dimensional Dynamic Convolution 论文地址:Omni-Dimensional Dynamic Convolution | OpenReview ODConv通过并行策略引入一种多维注意力机制以对卷积核空间的四个维度学习更灵活的…...

git代码回滚是使用reset还是revert

时光不能回退&#xff0c;Git却允许我们改变历史。 想要让Git回退历史&#xff0c;有以下步骤&#xff1a; 使用git log命令&#xff0c;查看分支提交历史&#xff0c;确认需要回退的版本 使用git reset --hard commit_id命令&#xff0c;进行版本回退 使用git push origin命…...

深入理解Java ThreadLocal及其内存泄漏防范

文章目录 一、ThreadLocal简介二、ThreadLocal的内存泄漏问题三、防止ThreadLocal导致的内存泄漏四、总结 一、ThreadLocal简介 在Java中&#xff0c;ThreadLocal是一种线程封闭的机制&#xff0c;其主要目的是为每个线程都创建一个单独的变量副本。这意味着&#xff0c;每个线…...

介绍10款ChatGPT替代产品

ChatGPT 引领着聊天 AI 的世界&#xff0c;许多人已经开始在日常生活中使用它。OpenAI 的 GPT-3 语言模型是聊天机器人的基础&#xff0c;它使得用户能够通过回答问题与 AI 进行交互。 GPT-4 的引入为机器人提供了更强大的功能。然而&#xff0c;它也有一个明显的缺点&#xff…...

数字逻辑 期末

概述 教材&#xff1a;《电子技术基础&#xff08;数字部分&#xff09;》 第六版 7400系列是TTL型芯片&#xff0c;商用型 数制 十进制->二进制 除2取余法&乘2取整法&#xff08;注意精度&#xff0c;但计科简单不考&#xff09; 十六进制->二进制 一位变四位 八…...

MT4交易外汇平台有哪些优势?为何是外汇投资首选?

外汇市场上存在着各种各样的外汇交易商&#xff0c;但是很多的外汇交易商所选择的交易平台都是MT4交易外汇平台。作为全世界范围内使用最为广泛的交易平台&#xff0c;MT4交易外汇平台具有哪些优势&#xff0c;能够让外汇交易商和外汇投资者都选择使用。本文就来具体的聊聊&…...

问卷调查工具实力榜单发布

问卷调查是从目标受众那里收集有价值的反馈和见解的有效方式。正确的调查问卷工具可以使问卷的创建、分发和分析变得更加容易和高效。在本文中&#xff0c;我们将问卷调查工具排行榜实力榜&#xff0c;为大家选择问卷平台的时候提供有价值的参考意见。 1、Zoho Survey Zoho S…...