说完一句话,í希望以这种方式进行转变:
Miracle => Iraclemend。
基本上把第一个字母附加到最后然后添加结束。
但是,特殊字符必须与单词末尾保持在同一位置
Britne's => Ritnesben'd
'是从结尾开始的2个位置,所以它必须在转换后的字符串第2个位置,这也适用于UpperCase(但是从字符串的开头)所以
McBeth => CbEthmend
我的解决方案如下:
1)循环显示单词并检测UpperCase和特殊字符, 如果它的UpperCase,将字符的索引推入UpperCases数组中 它的特殊字符推送字符和索引到特殊字符串, 如果它上面没有任何内容只是将字符附加到字符串(如果其UpperCase附加其小写变体)
因此英国人将在迈出第一步后成为英国人。使用索引2和char“'”(来自单词的末尾)在specialchars arr
2)变换字符串,以便britnes成为ritnesbend
3)从0循环到单词的长度,每次迭代检查该索引是否匹配来自specialchars或upperCases数组的索引。如果匹配特殊字符添加特殊字符+下一个字符,如果它匹配upperCases添加大写字符版本。
这在O(2k) = O(k)
中运行,其中k =单词的长度。
对字符串转换alghoritms没有太多经验,有没有更快的解决方案?
伪代码
function detetectChars ( word , object )
for i... word.length
if word[i] is spececial
object.specials.add( char: word[i] , index:i )
if word[i] is upperCase
object.upper.add(i)
function addSpecials ( word , object )
upperIndex = 0;
specialIndex = 0;
transformed = "";
for i... word.length
if i == object.upper[ upperIndex ]
transformed += word[i].toUpper(); upperIndex++;
if i == object.special[ specialIndex ]
transformed += object.special[ specialIndex++ ] + word[i]
else
transformed += word[i]
return transformed
感谢您的建议。
答案 0 :(得分:2)
你可以省去额外的阵列。记下字符串的长度,并一次构建一个字符的结果。存储第一个字符(即将结束)。在遍历字符串时,如果前一个字符是大写字母或特殊字符,请在适当的偏移量处将相应的字符添加到累积解法中。
您可能还想澄清何时大写和特殊字符'最终位置从结束或开始计算。例如,目前看来我们可以对" Si' ng"进行各种解释:
Traversing from the end:
ingSe'nd
Traversing from the start:
In'gsend