效率为o(1)的字符插入函数
在csdn论坛看到的一个题目,要求如下:
1、不能用库函数,要求达到效率o(1);
2、将符号'@'插入字符串ptr的首位,字符串ptr原内容按照原来的顺序排在'@'之后.
C/C++ code
void insert(char *str, char tmp)
{
填写代码:
}
void main(void)
{
char ptr[16]="abcdefg";
char temp='@';
insert(ptr, temp);
printf("%s"n;",ptr);
}
-------------------------------------
个人觉得字符串固定才是此题的突破点,剩下的才是效率和优化问题:
void insert(char *str, char tmp)
{
*(long*)(str+14 ) <<= 8;
*(long*)(str+12) <<= 8;
*(long*)(str+9 ) <<= 8;
*(long*)(str+6 ) <<= 8;
*(long*)(str+3) <<= 8;
*(long*)(str) <<= 8;
*str = tmp;
}
{
*(long*)(str+14 ) <<= 8;
*(long*)(str+12) <<= 8;
*(long*)(str+9 ) <<= 8;
*(long*)(str+6 ) <<= 8;
*(long*)(str+3) <<= 8;
*(long*)(str) <<= 8;
*str = tmp;
}
进一步优化为:
void insert(char *str, char tmp)
{
*(double*)(str+8) = *(double*)(str+1);
*(double*)(str+1) = *(double*)(str);
*str = tmp;
}
{
*(double*)(str+8) = *(double*)(str+1);
*(double*)(str+1) = *(double*)(str);
*str = tmp;
}
由于不知道汇编和寄存器等底层是如何操作了,所以如果有问题的话,也是在所难免的(上面的代码已通过VS2008和TC2.0测试),只是说在此采用的方法只是简单地对长度固定的字符串进行字符移动而已。

浙公网安备 33010602011771号