LeetCode——字符串(Java)

字符串

  • 简介
  • [简单] 344. 反转字符串
  • [简单] 541. 反转字符串 II
  • [中等] 151. 反转字符串中的单词

简介

记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路,如果有错误,可以在评论区提醒一下。

[简单] 344. 反转字符串

原题链接

方法①:

class Solution {
    public void reverseString(char[] s) {
        for(int i = 0; i < s.length / 2; i++){
            swap(s, i,s.length - 1 - i);
        }
    }
    
    private void swap(char[] s, int i, int j){
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }
}

方法②:

class Solution {
    public void reverseString(char[] s) {
        int i = 0;
        while(i < s.length - 1 - i){
            swap(s, i,s.length - 1 - i);
            i++;
        }
    }
    
    private void swap(char[] s, int i, int j){
        char temp = s[i];
        s[i] = s[j];
        s[j] = temp;
    }
}

[简单] 541. 反转字符串 II

原题链接

一开始想到比较差的方法:就是给到一个新的StringBuilder,然后按照结果的顺序依次再加入到StringBuilder中去,时间复杂度比较高,因为对那一部分不需要转置的字符也做了处理。

public String reverseStr(String s, int k) {
        StringBuilder sb = new StringBuilder(s.length());
        int over = -1; //标记已经完成处理的下标
        for (int i = 0; i < s.length(); i++) {
            if (i - over == 2 * k) {
                for (int j = over + k; j > over; j--) {
                    sb.append(s.charAt(j));
                }
                for (int j = over + k + 1; j <= over + 2 * k; j++) {
                    sb.append(s.charAt(j));
                }
                over = over + 2 * k;
            }
        }
        if(s.length() - 1 - over < k){
            for (int j = s.length() - 1; j > over; j--) {
                sb.append(s.charAt(j));
            }
        }else{
            for (int j = over + k; j > over; j--) {
                sb.append(s.charAt(j));
            }
            for (int j = over + k + 1; j < s.length(); j++) {
                sb.append(s.charAt(j));
            }
        }
        return sb.toString();
    }

这里首先提取了反转部分的代码,看起来更清晰,同时,也避开了对不需要转换的那一部分做处理的时间复杂度,效率更高

class Solution {
    public String reverseStr(String s, int k) {
        char[] c = s.toCharArray();
        int i = 2 * k - 1;
        int n = s.length();
        for (; i < n; i += 2 * k) {
            reverse(c, i-2*k+1, i-k);
        }
        if(i-2*k+1 < n) {
            reverse(c, i - 2 * k + 1, n - 1 < i - k ? n - 1 : i - k);
        }
        return new String(c);
    }

    private void reverse(char[] c, int left, int right){
        while(left < right){
            char temp = c[left];
            c[left] = c[right];
            c[right] = temp;
            left++;
            right--;
        }
    }
}

[中等] 151. 反转字符串中的单词

原题链接
总共分三步:删除空格,整体反转,单词反转。
在这里插入图片描述
deleteSpace():删除空格,先是删除后置空格,删除前置空格,再删除中间的空格,因为中间的空格需要保留一个,与删除前置后置逻辑上不同
使用StringBuilder类的话需要注意:
①:delete函数的右边界end对应下标并不会被删除,比如sb.delete(5,8),删除的是5,6,7下标对应元素。
在这里插入图片描述
②:先删除前导空格的话,会导致整个字符串的所有下标都左移,不利于判断,先删除后置空格则没有这个问题。

//先删除后置再删除前置
if(r + 1 < s.length() - 1) 
    sb = sb.delete(r + 1, s.length()); //删除后置空格
if(l > 0) 
    sb = sb.delete(0, l); //删除前导空格

③:StringBuilder使用一个String类型构造的时候,分配的空间不完全是String本身的长度,所以在delete操作中,删除右边空格的end边界应该是String的长度边界,而不是StringBuilder的。
在这里插入图片描述

class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = deleteSpace(s);
        sb = reverse(sb, 0, sb.length()-1);
        int start = 0;
        int i = 0;
        for(; i < sb.length(); i++){
            if(sb.charAt(i) == ' '){
                sb = reverse(sb, start, i - 1);
                start = i + 1;
            }
        }
        sb = reverse(sb, start, i - 1);
        return sb.toString();
    }

    private StringBuilder deleteSpace(String s){
        int l = 0;
        int r = s.length() - 1;
        while(s.charAt(l) == ' ') l++;
        while(s.charAt(r) == ' ') r--;
        StringBuilder sb = new StringBuilder(s);
        if(r + 1 < s.length() - 1) sb = sb.delete(r + 1, s.length()); //删除后置空格
        if(l > 0) sb = sb.delete(0, l); //删除前导空格
        int i = 0;
        while(i < sb.length()){
            if(sb.charAt(i) == ' ') {
                int start = ++i;
                while (sb.charAt(i) == ' ') i++;
                int end = i;
                if (end - start >= 0) {
                    sb = sb.delete(start, end);
                    i = start;
                }
            }
            i++;
        }
        return sb;
    }

    private StringBuilder reverse(StringBuilder sb, int l, int r){
        while(l < r){
            char temp = sb.charAt(l);
            sb.setCharAt(l, sb.charAt(r));
            sb.setCharAt(r, temp);
            l++;
            r--;
        }
        return sb;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

9 STM32标准库函数 之 独立看门狗(IWDG)所有函数的介绍及使用

9 STM32标准库函数 之 独立看门狗&#xff08;IWDG&#xff09;所有函数的介绍及使用 1. 图片有格式该文档修改记录&#xff1a;总结 函数描述格式&#xff1a; 函数名外设函数的名称函数原形原形声明功能描述简要解释函数是如何执行的输入参数{x}输入参数描述输出参数{x}输出…

sqli-labs关卡20(基于http头部报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场第二十关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于做非法攻击。注意靶场是可以练习的平台&#xff0c;不能随意去尚…

HLS基础issue

hls 是一个用C/c 来开发PL &#xff0c;产生rtl的工具 hls是按照rtl code来运行的 &#xff0c; 但是rtl会在不同器件调用不同的源语&#xff1b; 可能产生的ip使用在vivado另外一个器件的话 会存在问题&#xff1b; Hls &#xff1a; vivado ip &#xff0c; vitis kernel 是…

Os-hackNos-1

Os-hackNos-1 一、主机发现和端口扫描 主机发现 arp-scan -l端口扫描 nmap -P 192.168.80.141二、信息收集 访问80端口&#xff0c;可知目标是ubuntu系统&#xff0c;中间件是Apache 目录扫描&#xff0c;发现两个路径 dirsearch -u http://192.168.80.141/ -e *index.html路…

VPN创建连接 提示错误 628: 在连接完成前,连接被远程计算机终止。

提示错误 628: 在连接完成前&#xff0c;连接被远程计算机终止。 需要把这个地址配置一下&#xff1a; VPN类型&#xff1a;点对点PPTP 数据加密&#xff1a;如果没有加密的话&#xff0c; 要把这个选一下。

这个双11,阿里云经历了可能是历史级的大故障!

2023年11月12日17&#xff1a;44开始&#xff0c;阿里云发生严重故障&#xff0c;导致阿里巴巴大量产品无法连接&#xff0c;一时间&#xff0c;“阿里云盘崩了”、“淘宝又崩了”、“闲鱼崩了”、“钉钉崩了”等话题相继登上热搜。 此外&#xff0c;像纳思云充电桩、乐爽coole…

初识Linux:目录的创建销毁

目录 ​编辑 提示&#xff1a;以下指令均在Xshell 7 中进行 零、桌面的本质 &#x1f4bb; 扩展&#x1f387;&#xff1a; 一、cd指令&#xff1a; 1、cd - &#xff1a; 2、cd ~&#xff1a; 重命名命令&#xff1a;alias 二、stat指令 冷知识&#xff1a; 如果…

Python编程技巧 – 对象和类

Python编程技巧 – 对象和类 Python Programming Skills – Object and Class Python是一种面向对象的高级程序语言。 本文简要介绍用Python如何实现面向对象&#xff0c;对象和类的声明及使用&#xff0c;以及面向对象的特征&#xff0c;及其如何使用属性和方法的介绍&#x…

Windows上搭建一个网站(基本生产环境)

前言 本博客记录的是Windows上一次网站搭建的过程&#xff0c;主要是在前端采用的是React&#xff0c;后端采用的是Flask&#xff0c;记录一下生产版本搭建流程和坑点&#xff0c;供有缘人一起进步&#xff0c;当然本博客还存在很多不足。 前端项目构建生产版本 以React为例…

IPv4数据报格式

IPv4是IP协议的第四个版本(版本1-3和版本5都未曾使用过)IP地址不能反映任何有关主机位置的地理信息以前还有个逆地址解析协议RAPR(Reverse APR)&#xff0c;它的作用是使只知道自己MAC地址的主机能通过RAPR找到其IP地址&#xff0c;而现在的DHCP(Dynamic Host Configuration Pr…

智慧城市指挥中心,大屏幕究竟有什么用?

目前很多地区有在兴建智慧城市的项目&#xff0c;其城市指挥中心内一般都建有一张巨大的屏幕&#xff0c;这张屏幕究竟有什么用&#xff1f;是否可以用普通的电脑显示器进行代替呢&#xff1f; 智慧城市指挥中心内的巨大屏幕是智慧城市项目中的重要组成部分&#xff0c;其作用不…

回溯算法(3)--n皇后问题及回溯法相关习题

一、n皇后问题 1、概述 n皇后要求在一个nn的棋盘上放置n个皇后&#xff0c;使得他们彼此不受攻击&#xff0c;皇后可以攻击同一行、同一列、同一斜线上的敌人&#xff0c;所以n皇后问题要求寻找在棋盘上放置这n个皇后的方案&#xff0c;使得任意两个皇后都不在同一行、同一列或…

​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第12章 信息系统架构设计理论与实践&#xff08;P420~465&#xff09;-思维导图】 课本里章节里所有蓝色字体的思维导图

带您识别RJ45网口连接器/网口插座口的LED灯的平脚/斜脚,带弹/不带弹细节区分

Hqst华强盛&#xff08;盈盛电子&#xff09;导读&#xff1a;网口连接器,网口插座&#xff0c;也叫网口母座,因为产品规格众多&#xff0c;常常因为细小差别&#xff0c;耽误工程设计级或者生产排期延误&#xff0c;今天就带大家一起来认识下平脚RJ45网口连接器/网口插座与斜脚…

算法设计与分析 | 分治棋盘

题目 在一个2^k * 2^k个方格组成的棋盘中&#xff0c;恰有一个方格与其他方格不同&#xff0c;称该方格为一特殊方格&#xff0c;且称该棋盘为一特殊棋盘。在棋盘覆盖问题中&#xff0c;要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格&#xff0…

【动态规划】求解编辑距离问题

目录 问题描述递推关系运行实例时空复杂度优化Hirschberg 算法 问题描述 编辑距离问题是求解将⼀个字符串转换为另⼀个字符串所需的插⼊、删除、替换的最小次数。 C O M M O M → s u b C O M M U M → s u b C O M M U N → i n s C O M M U N E \mathbb{COMMOM} \overset{sub…

macbook ntfs能读不能复制 c盘ntfs拒绝访问怎么解决

如果你是一位Mac用户&#xff0c;你可能会遇到这样的问题&#xff1a;你的Mac能够读取NTFS格式的移动硬盘或U盘&#xff0c;但是不能往里面复制或者修改文件。或者&#xff0c;你的Windows电脑出现了C盘NTFS拒绝访问的错误&#xff0c;导致你无法正常使用系统。这些问题都是由于…

【vue2绘制echarts环状图】vue2使用echarts绘制环状图

效果图&#xff1a; 鼠标悬浮的效果图&#xff1a; 1&#xff1a;安装echarts yarn add echarts5.3.2 或 npm install echarts5.3.2 --save2.局部引入使用 在vue页面引入 <template><div><divref"myChart"style"{width: 400px;height: 350…

VMware Workstation Pro 12 ubuntu 20.04 突然奔溃,重新打开后导致win11系统蓝屏问题

1、虚拟机在执行一个程序时候&#xff0c;突然导致系统win11蓝屏 2、重新打开提示磁盘打开异常&#xff0c;网络搜索发现要删除磁盘lock文件&#xff0c;删除后&#xff0c;重启过程中还是会报各种异常 后来把所有的临时文件都删除了&#xff0c;就可以了 临时文件&#xff1…

如何去开发一个springboot starter

如何去开发一个springboot starter 我们在平时用 Java 开发的时候&#xff0c;在 pom.xml 文件中引入一个依赖就可以很方便的使用了&#xff0c;但是你们知道这是如何实现的吗。 现在我们就来解决这一个问题&#xff01; 创建 SpringBoot 项目 首先我们要做的就是把你想要给别…