替换空格

题目描述:给你一段字符串,把字符串中的每个空格替换成"%20",比如 I love China,则输出"I%20love%20China".




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




思路一:从头扫到尾,每一次碰到空格字符做替换,由于是把1个字符替换成3个字符,我们必须把空格后面所有的字符都后移两个字节,否则就有两个字符被覆盖了;

总结:假设字符串的长度为n,对每个空格字符,需要移动后面O(n)个字符,因此对含有O(n)个字符的字符串来言总的时间复杂度为O(n2);



(优化)思路二:

先遍历一次字符串,统计出空格数,计算出替换之后替换的长度=原长度+(空格数)*2;

从字符串的后面开始复制和替换。准备两个指针i,j。i指向原字符串的末尾,j指向替换之后的字符串的末尾。

当str[i]!=' '向前移动i,j。复制str[i]到str[j];

当str[i]=' ',i往前移动,j向前移动3格插入"%20";

知道i和j指向同一位置



总结:所有的字符只需要复制(移动)一次,算法的时间复杂度为O(n),比思路一要快

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#define M 100
using namespace std;
char str[M];
///          I%20love China
///         "I%20love%20China"
int l;
void show()
{
    for(int i=0;i<l;++i)
        printf("%c",str[i]);
    printf("\n");
    memset(str,0,sizeof(str));
}
void solve1()   //思路一
{
    if(l<=0) return ;
    int i,j;
    for(i=0;i<l;++i)
    {
        if(str[i]==' ')
        {
            str[i]='%';
            l+=2;
            for(j=l;j>=i+3;--j)
            {
                str[j]=str[j-2];
            }
            str[i+1]='2';
            str[i+2]='0';
        }
    }
}
void solve2()       //思路二
{
    if(l<=0) return ;
    int i=0,j,t=0;   //t用于记录空格的个数
    while(i<l)
    {
        if(str[i++]==' ')
            t++;
    }
    l+=t*2;
    j=l;
    while(i<j)
    {
        if(str[i]==' ')
        {
            i--;
            str[j]='0';
            str[j-1]='2';
            str[j-2]='%';
            j-=3;
        }
        else
        {
        str[j]=str[i];
        i--;
        j--;
        }
    }
}
int main()
{
    while(gets(str))
    {
    l=strlen(str);
 //   sovle1();
    solve2();
    show();
    }
    return  0;
}

<think>嗯,用户想了解SublimeText中替换空格的教程或快捷方式。之前引用中提到过相关操作,包括用空格替代tab键的设置(引用2)和删除空行的正则表达式(引用1),用户特别强调要替换"空格",可能有两种需求:1)将空白字符(如tab)转空格2)直接删除或修改普通空格字符。用户提供的引用材料很有价值:引用2详细说明了如何通过修改配置自动将tab转为空格,这个应该重点推荐。而引用1里的正则删除空行方法稍作改动也可用于删除连续空格,但用户没提删除需求,可能更关注转换。考虑到用户明确询问的是"替换空格的方法",其实有两种可能的操作:1.自动转换输入:在用户编辑时自动用空格替换tab键,这是最常用的场景2.批量修改:对现有文件替换(比如多个空格转一个)用户问的是"替换空格",但结合上下文应该是想用空格替代tab。引用2完整介绍了配置方法,可以直接用"方法一"回答(更简单),同时补充"方法二"快捷键映射作为备选。另外需要区分:-普通空格:直接查找替换即可(Ctrl+H输入空格)-特殊空白:包括tab、不间断空格等,需要正则表达式用户没说明具体场景,所以回复要分层:优先解答最可能的tab转空格配置,再补充其他空格处理技巧。引用3的快捷键(如Ctrl+H打开替换)也需要整合进去。最后可以加个应用场景提示,比如代码规范常用4空格缩进,避免用户误操作。</think> 以下是在 Sublime Text 中替换空格的详细教程,结合引用内容和高效操作指南: --- ### 方法一:配置编辑器自动将 Tab 键替换空格(推荐) 1. **修改用户配置** 打开设置:`Preferences` → `Settings`(Windows/Linux: <kbd>Ctrl</kbd>+<kbd>,</kbd>;macOS: <kbd>Cmd</kbd>+<kbd>,</kbd>) ```json { "tab_size": 4, // 设置1个Tab=4个空格 "translate_tabs_to_spaces": true, // 强制将Tab转为空格[^2] } ``` - 保存后**立即生效**,新输入的 Tab 键自动转为空格。 --- ### 方法二:批量替换已有文件中的空格/制表符 1. **正则替换**(适用于空行、多余空格等) - 打开替换面板:<kbd>Ctrl</kbd>+<kbd>H</kbd> - 启用正则匹配:点击左侧`.*`图标 - **删除所有空行**: ``` Find: ^[\s]*$\n Replace: (留空) ``` - **合并连续空格**(例如将2+空格替换为1个): ``` Find: \s{2,} Replace: (单个空格) ```[^1] 2. **可视化编辑**(精准控制) - 按住<kbd>Alt</kbd>用鼠标**拖动选中多列**区域 - 直接输入空格覆盖原有内容[^3] --- ### 方法三:直接替换特定空格字符 1. **基础操作**:<kbd>Ctrl</kbd>+<kbd>H</kbd> - `Find` 输入待替换空格(例如输入5个空格) - `Replace` 输入目标字符(如2个空格或空字符) 2. **特殊空白字符处理** - 制表符`\t`替换空格:`Find`输入`\t` → `Replace`输入空格 - 不间断空格`\u00A0`:粘贴该字符到查找框替换 --- ### ⚠️ 注意事项 1. 若配置文件修改后**不生效**,检查是否存在冲突设置(如插件影响) 2. **正则匹配关键符号**: - `\s` 匹配所有空白(含空格/Tab) - `^` 行首, `$` 行尾, `\n` 换行符 3. **显示空格**(辅助编辑): ```json {"draw_white_space": "all"} // 设置中开启可视化空格[^1] ``` > **应用场景**:代码缩进规范(Python强制空格)、清理文档多余空格、JSON/XML格式优化等。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值