剑指offer----C语言版----第三天

news2024/12/27 17:24:32

目录

1. 替换空格

1.1 题目描述

1.2 题目背景

1.3 必要的思考

1.4 思路一

1.5 思路二

1.6 思路三(学方法)

1.7 小试牛刀


1. 替换空格

原题链接:剑指 Offer 05. 替换空格 - 力扣(LeetCode)https://leetcode.cn/problems/ti-huan-kong-ge-lcof/submissions/

1.1 题目描述

给你一个字符串要求你把字符串中所有的空格换成%20。 

1.2 题目背景

在网络编程中,如果URL参数中含有特殊字符,如空格,'#' 等,则可能导致服务器无法获得正确的参数值。我们就需要将这些特殊的符号转换成服务器可以识别的字符。转换的规则是在'%' 的后面跟上ASCII码的两位十六进制的表示。比如空格的ASCII码是32,即十六进制的0x20,因此空格被替换成 "%20" 。再比如 '#' 的ASCII码为35,即十六进制的0x23,它在URL中被替换成 "%23"。

1.3 必要的思考

看到该题目,我们首先应该想到的是原来一个空格字符串,替换之后长度必然会变长。如果是在原来的字符串上进行替换,就有可能覆盖修改在该字符串后面的内存。如果是创建新的字符串并在新的字符串上进行替换,我们可以给自己分配足够多的内存。由于这道题有两种不同的解决方案,首先我们应该明确LeetCode上的是哪一种!如果是在原来的字符串上进行替换,必须保证输入的字符串后面有足够多的空余内存。

我帮大家测试了,LeetCode上输入的字符串后面是没有多余的内存的。

 这是LeetCode上典型的内存错误哈,本题就是越界访问了。

1.4 思路一

我们选择创建新的字符串,分配足够的空间

我们只需要遍历原来的字符串,是空格的话就追加 ''%20",不是空格就追加原字符串的内容。我就偷个懒,用C语言的库函数哈。

char* replaceSpace(char* s) {
    assert(s);
    char media[] = "%20";
    char* ret = (char*)calloc(sizeof(char), 30000);
    char* temp = s;
    while (*temp != '\0')
    {
        if (*temp == ' ')
        {
            strncat(ret, media, 3); //是空格追加"%20"
        }
        else
        {
            strncat(ret, temp, 1); //不是空格追加原字符
        }
        temp++;
    } 
    return ret;
}

1.5 思路二

我们假设输入的字符串后面有足够的空间,LeetCode上没有,可以开辟新的空间模拟输入的字符串后面有足够的空间,我嫌麻烦,就直接在Visual Studio 上演示啦。

我们遍历字符串,遇到一个空格,就将字符串后面的内容向后移动两个位置(因为一个空格被替换成 "%20" 多了两位嘛),直到遍历结束。

显然该解题方法时间复杂度为O(N*N),空间复杂度为O(1)。

下面以字符串 "We are happy." 举例分析。

char* replaceSpace(char* str)
{
    assert(str);
    char* temp = str;
    while (*temp != '\0')
    {
        if (*temp == ' ')
        {
            int length = strlen(str);
            char* end = str + length; //找到'\0'的位置
            //字符后移2位
            while (end > temp)
            {
                *(end + 2) = *end;
                end--;
            }
            //空格替换为"%20"
            *temp++ = '%';
            *temp++ = '2';
            *temp++ = '0';
            continue;
        }
        temp++;
    }
    return str;
}


int main()
{
    char str[1000];
    printf("请输入字符串:");
    gets(str);
    printf("%s",replaceSpace(str));
    return 0;
}

 

1.6 思路三(学方法)

我们先遍历一次字符串,这样就能统计出字符串中空格的个数,由此我们可以计算出替换之后字符串的总长度。一个空格被替换成 "%20" 就会在原字符串长度的基础上加二。我们维护两个指针p1,p2,让p1指向输入字符串的末尾 '\0' 的位置,让p2指向输出字符串的末尾的位置,计算方法:在p1的基础上加上 2 * 输入字符串中空格的个数。然后对*p1的值进行判断,如果*p1不是空格就把*p1的值给给*p2,p1减一,p2减一;如果是空格就让p1减一,p2填入 '0' 后减一,再填入 '2' 后减一,再填入 '%' 后减一,依次类推,直到p1和p2重合。重合就代表空格都被替换完毕。(最开始p1,p2相距 空格数 * 2 的距离,p1每次遇到一个空格,p1只会减一,而p2会减三,意味着在对空格数做减法,一旦空格数减完了,p1和p2自然就相遇了,程序也就该结束了。)

解题的时间复杂度O(N),空间复杂度O(1)。

下面以字符串 "We are happy." 举例分析一波:

char* replaceSpace(char* s)
{
    assert(s);
    char* temp = s;
    int count = 0;
    while (*temp != '\0')
    {
        if (*temp == ' ')
            count++;
        temp++;
    }
    int length = strlen(s);
    char* p1 = s + length; //找p1的位置
    char* p2 = p1 + 2 * count; //找p2的位置
    while (p1 < p2)
    {
        //*p1为空格
        if (*p1 == ' ')
        {
            p1--;
            //赋值"%20"
            *p2-- = '0';
            *p2-- = '2';
            *p2-- = '%';
        }
        else //*p1不为空格
        {

            *p2-- = *p1--;
        }
    }
    return s;
}

int main()
{
    char str[1000];
    printf("请输入字符串:");
    gets(str);
    printf("%s",replaceSpace(str));
    return 0;
}

1.7 小试牛刀

学了思路三的方法,宝们肯定能够拿捏这道题啦!!! 

 上链接:

力扣https://leetcode.cn/problems/merge-sorted-array/

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

回首2022,展望2023(年度总结)

回首2022&#xff0c;展望2023 热爱技术的伙计们&#xff1a; 哈喽&#xff0c;这篇文章经过一周左右的写写改改&#xff0c;在2022最后的工作日与大家见面&#xff0c;有人说总结是为了更好的开始。是的&#xff0c;一年的时间真的很快&#xff0c;马上就是2023了&#xff0…

k-mean聚类的python实现

文章目录介绍KMeans()函数介绍实例导入相关包整理数据手肘法确定分类个数创建模型绘制结果分为3类的结果作者&#xff1a;张双双介绍 sklearn.cluster模块提供了常用的非监督聚类算法。 该模块中每一个聚类算法都有两个变体: 一个是类(class)另一个是函数(function)。 类实现了…

day06 Debug基础练习

1.Debug模式 1.1 什么是Debug模式 是供程序员使用的程序调试工具&#xff0c;它可以用于查看程序的执行流程&#xff0c;也可以用于追踪程序执行过程来调试程序。 1.2 Debug介绍与操作流程 如何加断点 选择要设置断点的代码行&#xff0c;在行号的区域后面单击鼠标左键即可 …

刷题记录:牛客NC24858Job Hunt [最长路+两种不同判环详解]

传送门:牛客 题目描述: 奶牛们正在找工作。农场主约翰知道后&#xff0c;鼓励奶牛们四处碰碰运气。而且他还加了一条要求&#xff1a;一头牛在一个城市 最多只能赚D&#xff08;1≤D≤1000&#xff09;美元&#xff0c;然后它必须到另一座城市工作。当然&#xff0c;它可以在…

2自由度陀螺仪滑模控制和PID控制跟踪目标轨迹

目录 前言 1.陀螺仪模型 2.滑模跟踪控制 3.PID控制 4.总结 前言 不为别的&#xff0c;这篇小文章只为内涵某人&#xff0c;问候一下他&#xff1a;不是有手就行&#xff0c;哈哈~ 1.陀螺仪模型 2.滑模跟踪控制 对于2自由度陀螺仪有两个方向x、y跟踪&#xff0c;所以需要…

对于软件测试认识的几大误区,看看你有没有?

对于软件开发来说&#xff0c;软件测试可能还不被大众了解&#xff0c;很多开发人员&#xff0c;包括很多软件高层管理人员&#xff0c;由于缺乏软件测试的知识和实践经验&#xff0c;对软件测试的认识还有很多的误区&#xff1a; 误区一&#xff1a;如果软件发布后有质量问题…

我们一起来谈谈高并发和分布式系统的幂等如何处理!

什么是幂等性 幂等是一个数学与计算机学概念&#xff0c;在数学中某一元运算为幂等时&#xff0c;其作用在任一元素两次后会和其作用一次的结果相同。 在计算机中编程中&#xff0c;一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。 幂等函数或幂等…

Codeforces Round #841 (Div. 2)

题目链接 A. Joey Takes Money 题目描述 input output 题意&#xff1a; 有一个长度为n的数组&#xff0c;你可以进行一步操作&#xff0c;选择两个i,j&#xff0c;然后再选择两个数x,y&#xff0c;使得a[i]a[j] xy&#xff0c;然后将a[i] x,a[j] y&#xff0c;问任意步操…

Spring 中运用的 9 种设计模式

Spring中涉及的设计模式总结&#xff0c;在面试中也会经常问道 Spring 中设计模式的问题。本文以实现方式、实质、实现原理的结构简单介绍 Sping 中应用的 9 种设计模型&#xff0c;具体详细的刨析会在后面的文章发布&#xff0c;话不多说&#xff0c;来个转发、在看、收藏三连…

京东软件测试岗:惨不忍睹的三面,幸好做足了准备,月薪17k,已拿offer

我今年25岁&#xff0c;专业是电子信息工程本科&#xff0c;19年年末的时候去面试&#xff0c;统一投了测试的岗位&#xff0c;软件硬件都有&#xff0c;那时候面试的两家公司都是做培训的&#xff0c;当初没啥钱&#xff0c;他们以面试为谎言再推荐去培训这点让我特别难受。 …

Unity 搭建ILRuntime开发环境

Unity热更新目前主流的方案有: Lua, ILRuntime, puerts, huatuo方案。前两个大家都比较熟悉了&#xff0c;puerts 是基于TypeScript开发的热更新&#xff0c;huatuo是基于C#的方案。后两个大家会比较陌生。本系列分享基于ILRuntime来做热更新。 对啦&#xff01;这里有个游戏开…

【财务】FMS财务管理系统---存货管理

前一篇文章介绍了付款相关的内容&#xff0c;本文中笔者继续介绍FMS财务管理系统的设计&#xff0c;今天是关于存货管理的介绍。 财务存货管理应该就是针对公司的生产原材料、物料、成品、加工品的数量与金额的管控。 在前面也介绍了&#xff0c;存货属于公司的资产&#xff0…

纯Java实现一个网页版的Xshell

前言 最近由于项目需求&#xff0c;项目中需要实现一个WebSSH连接终端的功能&#xff0c;由于自己第一次做这类型功能&#xff0c;所以首先上了GitHub找了找有没有现成的轮子可以拿来直接用&#xff0c;当时看到了很多这方面的项目&#xff0c;例如&#xff1a;GateOne、webss…

微信小程序实现身份证识别-orc

项目中有一个识别身份证的需求&#xff0c;经过调研&#xff0c;最后决定使用微信小程序orc插件进行开发。 一:首先登录小程序公众平台。 1:进入设置> 第三方设置。 2:添加ocr插件。 3:添加完后&#xff0c;需要领取免费额度&#xff0c;100次/天。 https://fuwu.weixin…

SpringBoot+Vue实现后疫情时代下的旅游管理系统

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue.js 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JD…

Linux高级之日志管理

Linux高级之日志管理1.系统常用日志2.日志服务的稳定性3.自定义日志服务4.日志轮替5.内存日志1.系统常用日志 日志文件用于记录linux系统的各种运行信息的文件&#xff0c;相当于linux主机的日记&#xff0c;不同的日志文件记载了不同类型的信息,如Linux内核消息、用户登录事件…

React学习04-React_Ajax

写在前面 React本身只关注于界面&#xff0c;并不包含发送ajax请求的代码前端应用需要通过ajax请求与后台进行交互&#xff08;json数据&#xff09;React应用中需要集成第三方ajax库&#xff08;或自己封装&#xff09; 常用的ajax请求库 jQuery&#xff1a;比较重&#xf…

C|%输出各种类型的值总结

参考&#xff1a; C语音输出各种类型数据的方式 c语言中%s的用法 %d&#xff1a;十进制有符号整数 输出的数据范围是 signed int 的范围&#xff0c;即 0x80000000 ~ 0x7FFFFFFF&#xff08;-2147483648~2147483647&#xff09; %u&#xff1a;十进制无符号整数 输出范围0~0xF…

JVM-垃圾回收

1、GC分类 &#xff08;1&#xff09;部分收集&#xff08;Partial GC&#xff09; 新生代收集&#xff08;Minor GC/Young GC&#xff09;&#xff1a;只对新生代进行垃圾收集。&#xff08;读音[ˈmaɪnə(r)]&#xff09; 老年代收集&#xff08;Major GC/Old GC&#xff09…

基于SpringBoot+mybatis+mysql+html家具城进销存管理系统

基于SpringBootmybatismysqlhtml家具城进销存管理系统一、系统介绍二、功能展示1.用户登陆2.进货管理(货物管理员)3.退货管理&#xff08;货物管理员&#xff09;4.商品销售、商品销售退货(商品管理员)5.管理商品、商品类别、供应商、客户&#xff08;商品管理员&#xff09;6.…