剑指 Offer 05 string的替换

这篇博客详细介绍了如何在C++中替换字符串中的空格,探讨了`append()`、`push_back()`和`replace()`等函数在处理字符串时的不同用途,并指出`resize()`方法在原地修改字符串大小以实现空格替换的可行性。

剑指 Offer 05. 替换空格

题目链接: leetcode.

append 向字符串的末尾添加字符
insert 将一个、多个或一些列元素插入字符串中的指定位置。

append("%20") 是可以的,因为可以把字符串传给指针。

basic_string<CharType, Traits, Allocator>& append(
const value_type* ptr);

但是append(s[i]) 会报错 error: no matching member function for call to ‘append’
append(&s[i]) 则会

输入 “We are happy.”
输出 “We are happy.e are happy.%20are happy.re happy.e happy.%20happy.appy.ppy.py.y…”
预期结果 “We%20are%20happy.”

原因参考(https://stackoverflow.com/questions/33198779/c-append-one-character-from-a-string-to-another-string)

append()不是为了在字符串的后面添加单个字符而设计的,而是字符串。push_back()是为此目的而设计的。或者可以只使用操作符 +,适用于单个字符和多个字符。

所以:

ans.append(1, s[i]);  // or...
ans.push_back(s[i]);  // or...
ans += s[i];

push_back() 在字符串的末尾处添加一个元素。
replace() 用指定字符或者从其他范围、字符串或 C 字符串复制的字符来替代字符串中指定位置的元素。

replace似乎是没法完成把一个字符改成三个不同的字符滴

/*
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.5 MB, 在所有 C++ 提交中击败了37.87%的用户
*/
class Solution {
public:
    string replaceSpace(string s) {
    	if(s.empty())
    		return s;
    	string ans;
    	int N = s.size();
    	for(int i = 0;i < N;i++)
    	{
    		if(s[i] == ' ')
    		{
    			ans.append("%20");
    		}
    		else
    		{
    			ans.insert(ans.end(), s[i]); //ans.push_back(s[i]);
    		}
    	}
    	return ans;
    }
};

使用resize() 原地改变字符串

void resize( size_type count);//根据要求追加或删除元素,为字符串指定新的大小count
void resize( size_type count, value_type char_value);//在需要其他元素时,将追加的字符初始化为char_value

/*
执行用时:0 ms, 在所有 C++ 提交中击败了100.00%的用户
内存消耗:6.5 MB, 在所有 C++ 提交中击败了34.55%的用户
*/
class Solution {
public:
    string replaceSpace(string s) {
    	if(s.empty())
    		return s;
    	int cnt = 0;
    	for(auto x : s)
    	{
    		if(x == ' ')
    			cnt++;
    	}
    	int N = s.size();
    	s.resize(N + cnt * 2);
    	int i = N - 1,j = s.size() - 1; 
    	while(i != j)
    	{
    		if(s[i] == ' ')
    		{
    			s[j--] = '0';
    			s[j--] = '2';
    			s[j--] = '%';
    			i--;
    		}
    		else
    		{
    			s[j--] = s[i--];
    		}
    	}
    	return s;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值