String 用于字符计数的就地字符串操作

String 用于字符计数的就地字符串操作,string,algorithm,in-place,String,Algorithm,In Place,给定一个字符串,用它的立即计数替换每个字符。 例如:aaabbcc-a3b3c2 abab-a1b1a1b1您可以执行以下操作 函数getResultinput{ 如果!输入{ return;//如果字符串为空,则返回 } 如果input.length==1{//如果字符串长度为1,则返回input+'1' 返回输入+1 } var inputLength=input.length;//输入字符串的总长度 var preChar=输入[0];//跟踪上一个字符 var count=1;//上一

给定一个字符串,用它的立即计数替换每个字符。 例如:aaabbcc-a3b3c2
abab-a1b1a1b1

您可以执行以下操作

函数getResultinput{ 如果!输入{ return;//如果字符串为空,则返回 } 如果input.length==1{//如果字符串长度为1,则返回input+'1' 返回输入+1 } var inputLength=input.length;//输入字符串的总长度 var preChar=输入[0];//跟踪上一个字符 var count=1;//上一个字符的计数 对于变量i=1;iabab的console.logresult是,getResult'abab'假设您使用的是Javascript,我会这样做。只需将所有组与正则表达式匹配并循环:

函数charcountstr{ 常量exp=/\w\1*/g 让matches=str.matchexp 让输出= matches.forEachgroup=>{ 输出+=组[0]+组长度 } 返回输出 } const str='abab' 常量str2='aaabbcc' console.logcharCountstr//a1b1a1b1 console.logcharCountstr2//a3b3c2 此答案假设OP使用ASCII OP的需求分析 所需字节的分析: 当只有1个重复时,需要2个字节

当有2个重复时,需要2个字节

当有3个字节时,需要2个字节

当有9,2个字节时

当有99,3个字节时

当有999时,为4字节

当有2^64-1个重复时,只需要20个字节

如您所见,表示整数所需的字节至少为log10Nat 1,其中N是重复次数

重复一次 所以,当只有一个repeat并且没有空闲空间时,它必须一直迭代到

字节数大于所需字节数的序列至少有3次重复以给其空间

到达终点时重新分配 在一个字符串中,大多数人至少重复两到三次,而那些只重复一次的人并没有聚集在一个地方,这是很少需要的。这个算法做出了这样的假设

然后,该字符串将被向后修改,以防止数据被覆盖。这是因为对于每个重复一次的序列,存储它们将占用两个字节,所以当i处的序列写入2i时

C++14代码 包括 包括 包括 包括 //定义用于将INT转换为stringraw的帮助函数,无需设置字符串格式。 样板 尺寸到长度不可忽略不计 { 尺寸=0; 做{ ++碳纳米管; i/=10; }而i>0; 返回cnt; } /* *out应该指向数组的开头或最后一个。 *步骤应为1或-1。 */ 样板 自动输出,整数步,无符号i无例外 { 做{ *out=静态_casti%10+48; out+=步进; i/=10; }而i>0; 返回; } 样板 无效反向,双向,无例外 { 做{ 标准:iter_swapbeg++,结束; }当乞讨结束时; } 样板 自动uitosRandomAccessIt beg,未签名我不例外 { 自动返回=uitos_implbeg,1,i; //反转字符串以获得正确的顺序 反向strbeg,ret; 返回ret; } 样板 自动跟踪最后一次,未签名不例外 { 返回uitos_implast,-1,i; } 样板 大小\u t计数\u重复RandomAccessIt beg,RandomAccessIt end noexcept { 自动优先=乞讨; 自动&val=*beg; 做{ ++乞讨; }边乞讨结束&&*beg==val; 返回优先; } 样板 大小\u t r\u计数\u重复随机访问最后一个无例外 { 自动它=最后一个; 自动&val=*it; 做{ -它; }而*it==val; 返回最后一个-它; } 样板 结构字符计数 { static_assertstd::is_unsigned::value, 大小_类型应为无符号; static_assert!std::is_empty::value, 大小\类型不应为空; 私人: 使用str\u size\u t=typename字符串::size\u type; 使用str_it=typename字符串::迭代器; 静态资产std::是相同的::值, 只支持ASCII码;
static_assertsizeofsize_类型如果给定aaabbbaabbb,输出是否应为a3b3a3b3?请告诉我们您尝试了什么。@JiaHaoXu这是right@vivek_23除了一个接一个地移动每个字符,我没有得到一个好的解决方案,这是很昂贵的。这些字符串是使用ASCII格式的吗?对于什么操作来说,这似乎太复杂了wants@ninesalt,我可以n理解你的观点,我也不这么认为,但最具挑战性的部分是“就地”更换。我相信,会有更干净的方法来做。但现在,我只想到了上述逻辑,我必须确保每个边缘案例都得到处理。但无论如何,感谢你的建议。:-@Ankush Sharma input=input.substr0,i++input.substri+1这看起来不像是内联编辑。这似乎也是一个错误,您将输入[i+1]更新为。如果输入[i+1]与PRECHAR相同,那么您将无法检测到这一点。因为子字符串在内部创建了一个新的字符串对象,这是不合适的。请考虑一个字符数组并尝试在那里进行操作。这是不合适的,您将输出附加到一个新的变量。问题不是语言所特有的,而是一个算法问题。