Day8补代码随想录 字符串part1 344.反转字符串|541.反转字符串II|卡码网:54.替换数字

论文差不多搞定了,开始补落下的这几天的算法题

344.反转字符串

链接

https://programmercarl.com/0344.%E5%8F%8D%E8%BD%AC%E5%AD%97%E7%AC%A6%E4%B8%B2.html

题目

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

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

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

思路

  • 解读
    • 难点,原地修改输入数组,O(1)的额外空间
    • 考察字符串reverse函数的实现,要明确什么时候用库函数,什么时候不用库函数
  • Karl思路
    • 首尾交换→向中间移动→两个指针
    • code1
      class Solution {public void reverseString(char[] s) {int length=s.length;for (int i=0,j=length-1;i<length/2;i++,j--){char temp=s[i];s[i]=s[j];s[j]=temp;}  }
      }
      
  • Carl给的答案是:用while 循环
    class Solution {public void reverseString(char[] s) {int length=s.length;int l=0;int r=length-1;while(l<r){char temp=s[l];s[l]=s[r];s[r]=temp;l++;r--;}}
    }
    
  • 两个循环体
    • for(初始化;条件;更新){/循环体}
    • while(条件){//循环体 更新;}

总结

  • 字符串和数组的区别?
  • 库函数reverse();普通函数:swap();(C++)语言,
  • 在JAVA中用临时变量手动实现交换逻辑。
  • 低级错误
    • 变量必须声明;
    • 返回类型是void的,并且是原地变换数组,不用设置返回值
    • 在for中如果声明for (int i=0,int j=length-1;i<length/2;i++,j–)是不对的,在for循环的初始化部分,如果要声明多个变量,不能重复写数据类型,只能声明一次数据类型。

541.反转字符串II

题目

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

如果剩余字符少于 k 个,则将剩余字符全部反转。

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

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

思路

  • 我的思路
    • 两层循环,一层循环全部,里层每循环2k个就翻转一次,然后2k再加一次2k。
    • 剩余的值再进行一次for循环,确定范围。但是我的方法非常繁杂,确定循环的始末很容易错
    • class Solution {public String reverseStr(String s, int k) {size=s.length ();//最后一个不满足2k的序列怎么处理int leaf=size%(2*k);int leafstart=size-leaf;for(int i=0;i<leafstart;i++){int l=0;int r=2k-1;if(i=2k-1){   while(l<r){String temp=s[l];s[l]=s[r];s[r]=temp;l++;r--;//abcdefghijk  k-2, 3,6l=l+2k;r=r+2k;}  }else{continue;}}while(leafstart!=size-1){for(int i=leafstart,j=size-1;i<size-1;i++,j--){String temp_leaf=s[leafstart];s[leaftstart]=s[j];s[j]=temp_leaf;}}}
      }
      
  • gpt修改后
    class Solution {public String reverseStr(String s, int k) {// 将字符串转换为字符数组char[] chars = s.toCharArray();int size = chars.length;int leaf = size % (2 * k); // 计算不满2k的剩余部分int leafstart = size - leaf; // 剩余部分的起始位置int l = 0;int r = 2 * k - 1;// 遍历每个2k块,反转前k个字符for (int i = 0; i < leafstart; i++) {if (i % (2 * k) == 0) { // 每2k块进行一次反转,找起点,而不是找2k块的终点l = i;r = Math.min(i + k - 1, size - 1); // 确保右边界不越界// 反转[l, r]区间的字符while (l < r) {char temp = chars[l];chars[l] = chars[r];chars[r] = temp;l++;r--;}}}// 处理剩余字符if (leaf > 0) {l = leafstart;r = Math.min(leafstart + k - 1, size - 1); // 确保右边界不越界while (l < r) {char temp = chars[l];chars[l] = chars[r];chars[r] = temp;l++;r--;}}// 将字符数组转换回字符串并返回return new String(chars);}
    }
  • Karl
    • 更新:我的代码的问题:选择i++遍历有冗余(需要加if (i % (2 * k) == 0)) 解决办法:i+=2k就可以了
    • 翻转始末[i,i+k)区间,i+k不能超过边界条件,对边界的处理问题
    • class Solution {public String reverseStr(String s, int k) {char[] ch=s.toCharArray();for(int i=0;i<ch.length;i+=2*k){//始末条件限制,还需要不满足2k的时候,很巧妙,用了个min函数int start=i;int end=Math.min(ch.length-1,i+k-1);//左闭右开while(start<end){char temp=ch[start];ch[start]=ch[end];ch[end]=temp;start++;end--;}}return new String(ch);}
      }

总结

  • String要转换成数组,char[] ch=s.toCharArray();
  • 获取长度 .length获取数组的长度;.length()是一个方法,获取字符串的长度。
  • 【很关键】解决不满足2k的剩余数组的时候,用了个很巧妙的方法,int end=Math.min(ch.length-1,i+k-1);//左闭右开,确定了即使不足2k,可以翻转剩余的数组。
  • 【很关键】i+=2k循环思路
  • 低级错误
    • end++顺手写成end–;
    • i<ch.length写成了-1

卡码网:54.替换数字

题目

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。

对于输入字符串 “a5b”,函数应该将其转换为 “anumberb”

输入:一个字符串 s,s 仅包含小写字母和数字字符。

输出:打印一个新的字符串,其中每个数字字符都被替换为了number

样例输入:a1b2c3

样例输出:anumberbnumbercnumber

数据范围:1 <= s.length < 10000。

【对于线性数据结构的填充或删除,后序处理会高效的多】

思路

  • 我的思路
    • 识别数字后,替换为number
    • 问题,
      • 如果替换的话,数组长度就变了,后续的字母的位置都要变,怎么处理
      • 替换是直接用==吗?怎么识别数数字?
  • Carl
    • 预先扩充在数组尾部填充number的大小
    • 从后向前重新放入字母和数字,当遇到数字时,从后向前放入number
    • 双指针,i指向新长度的末尾,j指向旧长度的末尾
    • ×从前向后填充O(n^2) ;从后向前填充的好处:1.不用申请新数组 2.从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要讲添加元素之后的所有元素向后移动的问题。
  • CODE
    • import java.util.Scanner;public class Main {public static String replaceNumber(String s) {int count = 0; // 统计数字的个数int sOldSize = s.length();for (int i = 0; i < s.length(); i++) {if(Character.isDigit(s.charAt(i))){count++;}}// 扩充字符串s的大小,也就是每个空格替换成"number"之后的大小char[] newS = new char[s.length() + count * 5];int sNewSize = newS.length;// 将旧字符串的内容填入新数组System.arraycopy(s.toCharArray(), 0, newS, 0, sOldSize);// 从后先前将空格替换为"number"for (int i = sNewSize - 1, j = sOldSize - 1; j < i; j--, i--) {if (!Character.isDigit(newS[j])) {newS[i] = newS[j];} else {newS[i] = 'r';newS[i - 1] = 'e';newS[i - 2] = 'b';newS[i - 3] = 'm';newS[i - 4] = 'u';newS[i - 5] = 'n';i -= 5;}}return new String(newS);};public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String s = scanner.next();System.out.println(replaceNumber(s));scanner.close();}
      }
      

总结

  • s.charAt(i) 去字符串String在i处的字符Char。(Char)在某处(at)
  • Character.isDigit(a) 判断(Character类)是否(is)为数字(Digit)
  • char[] newArray = new char[length]; char[] newS = new char[s.length() + count * 5];

这道题对我来说难度太大,有一些语法记不住,二刷再学一遍

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

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

相关文章

第P4周:猴痘病识别

目录 前言一、我的环境二、代码实现1. 前期准备1.1 设置GPU1.2 导入数据1.3 划分数据集 2. 构建简单的CNN网络3. 训练模型3.1 设置超参数3.2 编写训练函数3.3 编写测试函数3.4 正式训练 4. 结果可视化4.1 Loss与Accuracy图4.2 指定图片进行预测 5. 保存并加载模型 三、学习体会…

ElasticSearch - 深入解析 Elasticsearch Composite Aggregation 的分页与去重机制

文章目录 Pre概述什么是 composite aggregation&#xff1f;基本结构after 参数的作用问题背景&#xff1a;传统分页的重复问题after 的设计理念响应示例 after 如何确保数据不重复核心机制Example步骤 1: 创建测试数据创建索引插入测试数据 步骤 2: 查询第一页结果查询第一页返…

如何用WPS AI提高工作效率

对于每位职场人而言&#xff0c;与Word、Excel和PPT打交道几乎成为日常工作中不可或缺的一部分。在办公软件的选择上&#xff0c;国外以Office为代表&#xff0c;而在国内&#xff0c;WPS则是不可忽视的一大选择。当年一代天才程序员求伯君创造了WPS&#xff0c;后面雷军把它装…

深度学习中的并行策略概述:1 单GPU优化

深度学习中的并行策略概述&#xff1a;1 单GPU优化 1 Training Larger Models on a Single GPU 在讨论模型的“扩展”时&#xff0c;往往会想到在多个GPU或多台机器上进行模型训练。不过&#xff0c;即便是在单个GPU上&#xff0c;也存在多种方法来训练更大规模的模型并提升…

Go+chromedp实现Web UI自动化测试

1.为什么使用go进行UI自动化测试&#xff1f; 速度&#xff1a;Go速度很快&#xff0c;这在运行包含数百个UI测试的测试套件时是一个巨大的优势 并发性&#xff1a;可以利用Go的内置并发性(goroutines)来并行化测试执行 简单&#xff1a;Go的简约语法允许您编写可读且可维护…

2、C#基于.net framework的应用开发实战编程 - 设计(二、三) - 编程手把手系列文章...

二、设计&#xff1b; 二&#xff0e;三、构建数据库&#xff1b; 此例子使用的是SQLite数据库&#xff0c;所以数据库工具用的SQLiteStudio x64&#xff0c;这个是SQLite专用的数据库设计管理工具&#xff0c;其它的数据库管理工具比如DBeaver的使用请见实战工具系列文章。 1、…

2011-2020年各省城镇职工基本医疗保险年末参保人数数据

2011-2020年各省城镇职工基本医疗保险年末参保人数数据 1、时间&#xff1a;2011-2020年 2、来源&#xff1a;国家统计局 3、指标&#xff1a;省份、时间、城镇职工基本医疗保险年末参保人数 4、范围&#xff1a;31省 5、指标解释&#xff1a;参保人数指报告期末按国家有关…

Github优质项目推荐(第九期)

文章目录 Github优质项目推荐&#xff08;第九期&#xff09;一、【tldraw】&#xff0c;37.1k stars - 在 React 中创建无限画布体验的库二、【zapret】&#xff0c;9.1k stars - 独立&#xff08;无需第三方服务器&#xff09;DPI 规避工具三、【uBlock】&#xff0c;48.3k s…

Web安全攻防入门教程——hvv行动详解

Web安全攻防入门教程 Web安全攻防是指在Web应用程序的开发、部署和运行过程中&#xff0c;保护Web应用免受攻击和恶意行为的技术与策略。这个领域不仅涉及防御措施的实现&#xff0c;还包括通过渗透测试、漏洞挖掘和模拟攻击来识别潜在的安全问题。 本教程将带你入门Web安全攻防…

KOI技术-事件驱动编程(前端)

1 “你日渐平庸&#xff0c;甘于平庸&#xff0c;将继续平庸。”——《以自己喜欢的方式过一生》 2. “总是有人要赢的&#xff0c;那为什么不能是我呢?”——科比布莱恩特 3. “你那么憎恨那些人&#xff0c;和他们斗了那么久&#xff0c;最终却要变得和他们一样&#xff0c;…

嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目

此项目是基于人脸识别的考勤系统开发&#xff0c;包括如下模块&#xff1a; 1、人脸识别考勤系统GUI界面设计&#xff0c;包括&#xff1a; &#xff08;1&#xff09;Qt环境(window环境/linux环境) &#xff1b; &#xff08;2&#xff09;Qt工程创建分析&#xff1b; &am…

UGUI简单动画制作

一、最终效果 UI简单动画制作 二、制作过程 1、打开动画制作窗口 2、新建一个动画 3、给一个对象制作动画 4、创建动画控制器进行不同动画变换控制 5、书写脚本&#xff0c;通过按钮来进行不同动画切换 using System.Collections; using System.Collections.Generic; using U…

Windows Powershell实战指南(未完成)

目前只作简单了解&#xff0c;开始吧。 一、初识Powershell 目标 初步认识 Powershell和其集成环境 Ise&#xff0c;学会基本设置 实验 我们从简单的例子开始&#xff1a;希望你能从控制台和ISE的配置中实现相同的结果。然后按照下面五步进行。 &#xff08;1&#xff09;选…

PyQt实战——实现可视化音频播放器(十三)

系类往期文章&#xff1a; PyQt5实战——多脚本集合包&#xff0c;前言与环境配置&#xff08;一&#xff09; PyQt5实战——多脚本集合包&#xff0c;UI以及工程布局&#xff08;二&#xff09; PyQt5实战——多脚本集合包&#xff0c;程序入口QMainWindow&#xff08;三&…

Java日志框架:log4j、log4j2、logback

文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…

RustDesk内置ID服务器,Key教程

RustDesk内置ID服务器&#xff0c;Key教程 首先需要准备一个域名&#xff0c;并将其指定到你的 rustdesk 服务器 ip 地址上&#xff0c;这里编译采用的是Github Actions &#xff0c;说白了是就workflows&#xff0c;可以创建一些自动化的工作流程&#xff0c;例如代码的检查&a…

OpenHarmony怎么修改DPI密度值?RK3566鸿蒙开发板演示

本文介绍在开源鸿蒙OpenHarmony系统下&#xff0c;修改DPI密度值的方法&#xff0c;触觉智能Purple Pi OH鸿蒙开发板演示&#xff0c;搭载了瑞芯微RK3566四核处理器&#xff0c;Laval鸿蒙社区推荐开发板&#xff0c;已适配全新开源鸿蒙OpenHarmony5.0 Release系统&#xff0c;适…

OCR实践-Table-Transformer

前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer&#xff0c;来自微软&#xff0c;基于Detr&#xff0c;在PubTables1M 数据集上进行训练&#xff0c;模型是在提出数据集同时的工作&#xff0c; paper PubTables-1M: Towards comp…

常见的邮件协议SMTP和POP3

常见的邮件协议包括SMTP和POP3&#xff0c;SMTP用来发送邮件&#xff0c;POP3用来接收邮件信息。 SMTP SMTP 是一种用于发送电子邮件的协议。它的主要作用是将**电子邮件**从邮件客户端&#xff08;如 Outlook、Thunderbird&#xff09;或邮件服务器发送到接收服务器。 SMTP …

UGUI源码分析 --- UI的更新入口

首先所有的UI组件都是添加到画布&#xff08;Canvas&#xff09;显示的&#xff0c;所以首先要从Canvas入手&#xff0c;通过搜索脚本函数以及使用Profiler查看UI的函数的执行&#xff0c;定位到了willRenderCanvases函数 打开UI的文件夹&#xff0c; 通过搜索willRenderCanvas…