代码随想录_字符串

字符串

344.反转字符串

344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须**原地修改输入数组**、使用 O(1) 的额外空间解决这一问题。

思路: 双指针

代码:

class Solution {public void reverseString(char[] s) {// 双指针int l = 0,r = s.length - 1;while(l < r) {char t = s[l];s[l] = s[r];s[r] = t;l++;r--;}}
}
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

541.反转字符串 II

541. 反转字符串 II

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

思路: 步长为2k进行循环, 每次循环内对: 2k的前k个 或 不足2k的剩余所有, 进行反转

代码:

class Solution {public String reverseStr(String s, int k) {char[] str = s.toCharArray();// 1. 2k 2k 循环遍历for(int i = 0;i < str.length;i += 2*k) {// 2. 找2k的前k个 或 不足2k的剩余所有 进行反转int start = i;int end = Math.min(str.length - 1,start + k - 1);while(start < end) {char t = str[start];str[start] = str[end];str[end] = t;start++;end--;}}// 3. 反转return new String(str);}
}

54.替换数字

54.替换数字(第八期模拟笔试)

image-20250116225304443

思路: 双指针, 先计算新数组的大小, 将原数组复制到新数组后, 从后往前开始替换

代码:

import java.util.*;
public class Main{public static void main (String[] args) {// 1. 输入Scanner sc = new Scanner(System.in);String s = sc.next();char[] oStr = s.toCharArray();// 2. 计算新数组的长度int olen = oStr.length;int nlen = olen;for(int i = 0;i < olen;i++) {if(oStr[i] >= '0' && oStr[i] <= '9') {nlen += 5;// number共6位, 覆盖原来字母一位, 每次还需再加5位}}// 3. 将原数组的内容copy到新数组char[] nStr = new char[nlen];for(int i = 0;i < olen;i++) {nStr[i] = oStr[i];}// 4. 对新数组进行处理for(int i = olen - 1,j = nlen - 1;i >= 0;i--) {if(nStr[i] >= '0' && nStr[i] <= '9') {nStr[j--] = 'r';nStr[j--] = 'e';nStr[j--] = 'b';nStr[j--] = 'm';nStr[j--] = 'u';nStr[j--] = 'n';}else {nStr[j--] = nStr[i]; }}// 5. 打印结果System.out.print(nStr);    }
}

法二: 不将原数组的内容copy到新数组

import java.util.*;
public class Main {public static void main (String[] args) {Scanner sc = new Scanner(System.in);String str = sc.next();char[] s = str.toCharArray();// 1. 计算新数组长度int len = s.length;int newLen = len;for(int i = 0;i < len;i++) {if(s[i] >= '0' && s[i] <= '9') {newLen+=5;}}// 2. 替换char[] c = new char[newLen];for(int i = len - 1,j = newLen - 1;i >= 0;i--) {if(s[i] >= '0' && s[i] <= '9') {c[j--] = 'r';c[j--] = 'e';c[j--] = 'b';c[j--] = 'm';c[j--] = 'u';c[j--] = 'n';}else {c[j--] = s[i];}}// 3. 输出System.out.print(c);}
}

151.反转字符串中的单词

反转字符串中的单词

image-20250117105446162

思路: 双指针, 先去掉多余空格, 再反转整个字符串, 最后反转每个单词

代码:

class Solution {public String reverseWords(String s) {char[] str = s.toCharArray();// 1. 去除 首尾 以及 中间 多余空格str = removeSpace(str);// 2. 将整个字符串反转reverse(str,0,str.length - 1);// 3. 将每个单词反转reverseEachWords(str);return new String(str);}// 1. 去除 首尾 以及 中间 多余空格public static char[] removeSpace(char[] str) {int slow = 0;// 1. 去空格for(int fast = 0;fast < str.length;fast++) {// 该if 每次操作一个单词if(str[fast] != ' ') {// fast所指的是字母时开始移动if(slow != 0) {// 处理是否加空格str[slow++] = ' ';}// 加单词, slow每次增加一个单词的长度while(fast < str.length && str[fast] != ' ') {// 顺序不能换, 否则下标越界str[slow++] = str[fast++];}}}// 2. 返回有效数组return Arrays.copyOfRange(str,0,slow);// 0 ~ (slow - 1}// 2. 将整个字符串反转public static void reverse(char[] str,int left,int right) {while(left < right) {str[left] ^= str[right];str[right] ^= str[left];str[left] ^= str[right];// 注意两个指针的变换不同left++;right--;}}// 3. 将每个单词反转public static void reverseEachWords(char[] str) {for(int start = 0,end = 0;end <= str.length;end++) { // end = str.length 便于与 str[end] = ' ' 统一操作if(end == str.length || str[end] == ' ') {// 走到一个单词尽头reverse(str,start,end - 1);// 反转该单词start = end + 1;// 更新start位置}}}}

55.右旋字符串(第八期模拟笔试)

右旋字符串(第八期模拟笔试)

题目描述

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

例如,对于输入字符串 “abcdefg” 和整数 2,函数应该将其转换为 “fgabcde”。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

思路: 反转字符串, 先反转整体, 再依次翻转子串

代码:

import java.util.Scanner;
public class Main{public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = Integer.parseInt(sc.next());String s = sc.next();char[] str = s.toCharArray();int len = str.length;// 1. 整体翻转reverse(str,0,len - 1);// 2. 前半部分翻转reverse(str,0,n - 1);// 3. 后半部分翻转reverse(str,n,len - 1);System.out.print(str);}public static void reverse(char[] str,int left,int right) {while(left < right) {str[left] ^= str[right];str[right] ^= str[left];str[left] ^= str[right];left++;right--;}}
}

28.找出字符串中第一个匹配项的下标

28. 找出字符串中第一个匹配项的下标

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystackneedle 仅由小写英文字符组成

思路: kmp

代码:

class Solution {public int strStr(String haystack, String needle) {char[] s1 = haystack.toCharArray();char[] s2 = needle.toCharArray();int m = s1.length,n = s2.length;// 1. 计算next数组int[] next = nextArray(s2,n);// 2. 匹配子串int x = 0,y = 0;// x,y分别指向s1,s2当前操作的位置while(x < m && y < n) {if(s1[x] == s2[y]) {// 两字符串当前位置相等x++;// 继续往后匹配y++;}else if(y > 0) {// 两字符串当前位置不相等, s2要匹配的不是第一个字母y = next[y];// y前退}else {// 两字符串当前位置不相等, s2要匹配的是第一个字母x++;// s1往后走}}return y == n ? x - y : -1;// s2是否完全匹配}// 1. 计算next数组public static int[] nextArray(char[] s2,int len) {// 1.1 对0 1位置的特殊判断if(len == 1) return new int[] {-1};int[] next = new int[len];next[0] = -1;next[1] = 0;// 1.2 完善next数组int cnt = 0,i = 2;while(i < len) {if(s2[i - 1] == s2[cnt]) {// 当前位置和要比对的位置相同next[i++] = ++cnt;// 前缀和累加}else if(cnt > 0) {cnt = next[cnt];// 当前位置和要比对的位置不相同, 能往前退就往前退}else {// 当前位置和要比对的位置不相同, 不能往前退, 则next[i] = 0next[i++] = 0;}}// 1.3 返回return next;}
}

注: 不能用for, 因为每次判断i不一定要往后走

459.重复的子字符串

459. 重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

示例 1:

输入: s = “abab”
输出: true
解释: 可由子串 “ab” 重复两次构成。

提示:

  • 1 <= s.length <= 104
  • s 由小写英文字母组成

思路: kmp求next数组, 求到len + 1的位置, 求出整个串的最长公共前后缀, 原串减去公共前后缀剩下的就是最小重复子字符串

代码随想录讲解

代码:

class Solution {public boolean repeatedSubstringPattern(String s) {// 1. 计算next数组(要将整个串的最长公共前后缀计算出来)char[] cs = s.toCharArray();int len = cs.length;int[] next = getNext(cs,len);// 2. 判断原字符串的长度是否是 公共前后缀剩余串(最小子串)的整数倍if(next[len] > 0 && len % (len - next[len]) == 0) {// 要判断next[len] > 0// 3. 返回return true;}return false;}// 1. 计算next数组(要将整个串的最长公共前后缀计算出来)public int[] getNext(char[] cs,int len) {// 1. 对0 1位置的特殊判断if(len == 1) {return new int[] {-1,0};}// 2. 补充next数组int i = 2,cnt = 0;// i代表当前处理的位置(后缀),cnt前缀的位置int[] next = new int[len + 1];// 要计算整个数组的最长公共前后缀next[0] = -1;next[1] = 0;while(i <= len) {if(cs[i - 1] == cs[cnt]) {next[i++] = ++cnt;}else if (cnt > 0) {cnt = next[cnt];}else {next[i++] = cnt;}}// 3. 返回return next;}
}

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

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

相关文章

Visual Studio Community 2022(VS2022)安装方法

废话不多说直接上图&#xff1a; 直接上步骤&#xff1a; 1&#xff0c;首先可以下载安装一个Visual Studio安装器&#xff0c;叫做Visual Studio installer。这个安装文件很小&#xff0c;很快就安装完成了。 2&#xff0c;打开Visual Studio installer 小软件 3&#xff0c…

PostgreSQL的学习心得和知识总结(一百六十六)|深入理解PostgreSQL数据库之\watch元命令的实现原理

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

在k8s中部署一个可外部访问的Redis Sentinel

1.前提条件&#xff1a; 1.部署了multus 想要k8s外部能访问k8s内部的redis&#xff0c;redis-server启动时必须使用multus的IP 2.helm客户端安装 2.开始安装 准备3个multus ip 10.10.10.130 10.10.10.131 10.10.10.132 apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttac…

目标跟踪算法发展简史

单目标跟踪&#xff08;Single Object Tracking&#xff0c;SOT&#xff09;是计算机视觉领域中的一个重要研究方向&#xff0c;旨在在视频序列中持续定位并跟踪一个特定目标。随着计算机视觉和机器学习技术的飞速发展&#xff0c;单目标跟踪算法经历了从经典方法到深度学习的演…

使用LPT wiggler jtag自制三星单片机(sam88 core)编程器-S3F9454

写在前面 新年好&#xff0c;各位&#xff0c;今天来分享制作一个三星单片机的编程器 嘿嘿&#xff0c;x鱼垃圾佬元件库有些三星单片机s3f9454&#xff0c;编程器不想买&#xff0c;基本拿来拆件玩的。但&#xff0c;前些时候csdn下载到它的编程时序&#xff0c;自己来做个编程…

Spring 中的事件驱动模型

事件驱动的基本了解 事件模式也就是观察者模式&#xff0c;当一个对象改变的时候&#xff0c;所有依赖的对象都会收到一个通知。 Subject&#xff1a;抽象主题 Observer&#xff1a;具体主题 Concrete Subject&#xff1a;抽象观察者&#xff0c;在得到更新通知之后去更新自…

玉米植物结构受乙烯生物合成基因 ZmACS7 的调控

摘要&#xff1a; 植物高度和叶片角度是玉米&#xff08;Zea mays&#xff09;植物结构的两个关键决定因素&#xff0c;与高种植密度下的抗倒伏性和冠层光合作用密切相关。这两个性状主要由几种植物激素调节。然而&#xff0c;乙烯在调节玉米植物结构中的机制&#xff0c;特别…

Java高频面试之SE-15

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本牛马baby今天又来了&#xff01;哈哈哈哈哈嗝&#x1f436; String 怎么转成 Integer 的&#xff1f;它的原理是&#xff1f; 在 Java 中&#xff0c;要将 String 转换为 Integer 类型&#xff0c;可…

解锁Java中的国密算法:安全保障的密钥

一、引言 在数字化浪潮席卷全球的当下&#xff0c;信息安全已然成为国家、企业乃至个人无法忽视的重要议题。国密算法&#xff0c;作为我国自主研发的密码算法体系&#xff0c;宛如坚固的盾牌&#xff0c;为国家信息安全筑起了一道坚不可摧的防线。它的诞生&#xff0c;不仅承载…

金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践

导读&#xff1a;中信银行信用卡中心每日新增日志数据 140 亿条&#xff08;80TB&#xff09;&#xff0c;全量归档日志量超 40PB&#xff0c;早期基于 Elasticsearch 构建的日志云平台&#xff0c;面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此…

1.2.神经网络基础

目录 1.2.神经网络基础 1.2.1.Logistic回归 1.2.2 梯度下降算法 1.2.3 导数 1.2.4 向量化编程 1.2.5 正向传播与反向传播 1.2.6.练习 1.2.神经网络基础 1.2.1.Logistic回归 1.2.1.1.Logistic回归 逻辑回归是一个主要用于二分分类类的算法。那么逻辑回归是给定一个x ,…

MIAOYUN信创云原生项目亮相西部“中试”生态对接活动

近日&#xff0c;以“构建‘中试’生态&#xff0c;赋能科技成果转化”为主题的“科创天府智汇蓉城”西部“中试”生态对接活动在成都高新区菁蓉汇隆重开幕。活动分为成果展览、“中试”生态主场以及成果路演洽谈对接三大板块。在成果展览环节&#xff0c;成都元来云志科技有限…

【vitePress】基于github快速添加评论功能(giscus)

一.添加评论插件 使用giscus来做vitepress 的评论模块&#xff0c;使用也非常的简单&#xff0c;具体可以参考&#xff1a;giscus 文档&#xff0c;首先安装giscus npm i giscus/vue 二.giscus操作 打开giscus 文档&#xff0c;如下图所示&#xff0c;填入你的 github 用户…

成就与远见:2024年技术与思维的升华

个人主页&#xff1a;chian-ocean 前言: 2025年1月17日&#xff0c;2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300&#xff0c;虽然与顶尖博主仍有一定差距&#xff0c;但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…

一文了解如何在Qt中间集成Halcon窗口并在子线程显示(附工程源码下载链接)

在基于图像处理的开发中&#xff0c;Halcon作为功能强大的图像处理库&#xff0c;经常需要与Qt结合&#xff0c;以便通过Qt提供的UI功能更好地显示和交互。本文将讲解如何在Qt中集成Halcon窗口&#xff0c;并通过子线程实现Halcon图像的显示&#xff0c;保证主线程的流畅运行。…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

深度学习-89-大语言模型LLM之AI应用开发的基本概念

文章目录 1 什么是智能体(Agent)2 什么是大语言模型(LLM)2.1 LLM的训练及使用2.2 Transformer架构2.3 基于LLM的Agent框架3 什么是检索增强生成(RAG)3.1 RAG是什么3.2 生成式AI应用开发3.3 RAG的整体流程3.4 RAG技术3.4.1 简单RAG(Simple RAG)3.4.2 校正RAG(Corrective RAG)3.4…

电子科大2024秋《大数据分析与智能计算》真题回忆

考试日期&#xff1a;2025-01-08 课程&#xff1a;成电信软学院-大数据分析与智能计算 形式&#xff1a;开卷 考试回忆版 简答题&#xff08;4*15&#xff09; 1. 简述大数据的四个特征。分析每个特征所带来的问题和可能的解决方案 2. HDFS的架构的主要组件有哪些&#xff0…

Windows电脑安装USB Redirector并实现内外网跨网USB共享通信访问

文章目录 前言1. 安装下载软件1.1 内网安装使用USB Redirector1.2 下载安装cpolar内网穿透 2. 完成USB Redirector服务端和客户端映射连接3. 设置固定的公网地址 前言 我们每天都在与各种智能设备打交道&#xff0c;从手机到电脑&#xff0c;再到各种外设&#xff0c;它们已经…

Docker 实现MySQL 主从复制

一、拉取镜像 docker pull mysql:5.7相关命令&#xff1a; 查看镜像&#xff1a;docker images 二、启动镜像 启动mysql01、02容器&#xff1a; docker run -d -p 3310:3306 -v /root/mysql/node-1/config:/etc/mysql/ -v /root/mysql/node-1/data:/var/lib/mysql -e MYS…