Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 最佳时间内的字符串变换_Arrays_String_Algorithm - Fatal编程技术网

Arrays 最佳时间内的字符串变换

Arrays 最佳时间内的字符串变换,arrays,string,algorithm,Arrays,String,Algorithm,有一个词,我希望它以这样的方式传递: 奇迹=>Iraclemend 基本上取第一个字母,将其附加到结尾,然后添加结尾 但是,特殊字符必须从单词的末尾保持在同一位置,所以 Britne's => Ritnesben'd '是从结尾的第2个位置,所以它必须处于从结尾的第2个位置,这也适用于大写字母(但从字符串的开头),所以 我的解决办法如下: 1) 循环遍历单词并检测大写和特殊字符, 如果是大写,则将该字符的索引推入大写字符数组 它的特殊字符将字符和索引推入特殊字符数组, 如果上面没有

有一个词,我希望它以这样的方式传递:

奇迹=>Iraclemend

基本上取第一个字母,将其附加到结尾,然后添加结尾

但是,特殊字符必须从单词的末尾保持在同一位置,所以

   Britne's => Ritnesben'd
'是从结尾的第2个位置,所以它必须处于从结尾的第2个位置,这也适用于大写字母(但从字符串的开头),所以

我的解决办法如下:

1) 循环遍历单词并检测大写和特殊字符, 如果是大写,则将该字符的索引推入大写字符数组 它的特殊字符将字符和索引推入特殊字符数组, 如果上面没有任何内容,只需将字符附加到字符串(如果其大写字母附加其小写变量)

所以,第一步之后,Britne将成为Britne。在specialchars arr中,索引2和字符“”(从单词末尾开始)

2) 转换字符串,使britnes成为ritnesbend

3) 循环从0到单词的长度,每次迭代检查该索引是否与特殊字符或大写字母数组中的索引匹配。如果匹配特殊字符,则添加特殊字符+下一个字符;如果匹配大写字符,则添加字符的大写版本

这在
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

谢谢你的建议

您可以省去额外的数组。记下字符串的长度,一次生成一个字符的结果。存储第一个字符(即将结束的字符)。在遍历字符串时,如果上一个字符是大写或特殊字符,请在适当的偏移量处将适当的字符添加到累加解决方案中

您可能还需要澄清大写和特殊字符的最终位置是从末尾还是从开头开始计算的。例如,目前,我们似乎可以对“Si'ng”有不同的解释:


我的错误拼写,谢谢你指出“解决方案应该用javascript或c++实现”——选择一个,或者干脆忽略这两个,选择一个可选的,因为这个问题中没有代码。做得比O(k)好意味着你甚至可以避免看每个字符。很容易看出这是不可能的,因为你至少需要检查每个角色,看看它是否是一个特殊的角色。除非输入的大多数字符不需要更改或移动,否则输出的速度永远不能超过O(输出大小)。这里的情况并非如此,除非将字符串表示为循环缓冲区。@Dukeling添加的伪代码可以表示为具有起始索引和结束索引的固定大小数组,并带有环绕。如果你用这种方式来表示字符串(我知道没有语言),你可以把第一个字符移到结尾,并在“固定时间”(如果数组足够大)中添加“结束”,但是如果字符串中有特殊字符或大写,这是不起作用的,这仍然是找不到的。
 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
Traversing from the end:
  ingSe'nd

Traversing from the start:
  In'gsend