相关疑难解决方法(0)

没有strrev的反向字符串

前一段时间在求职面试中,我得到了在使用PHP的情况下在PHP中反转字符串的任务strrev.

我的第一个解决方案是这样的:

$s = 'abcdefg';
$temp = '';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
    $temp .= $s{$length - $i - 1};
}
var_dump($temp);
// outputs string(7) "gfedcba"
Run Code Online (Sandbox Code Playgroud)

然后他们问我是否可以在不增加内存使用量的情况下这样做(不使用$temp变量或任何变量来复制反转的字符串)并且我失败了.这一直困扰着我,从那时起我试图多次解决这个问题,但我经常失败.

我的最新尝试看起来像这样:

$s = 'abcdefg';
for ($i = 0, $length = mb_strlen($s); $i < $length; $i++) {
    $s = $s{$i * 2} . $s;
}
var_dump($s);
// outputs string(14) "gfedcbaabcdefg"
Run Code Online (Sandbox Code Playgroud)

它不是在循环之后切断"abcdefg"的解决方案,因为那时我仍然会使用的内存量增加一倍.我需要在循环的每次迭代中删除最后一个字符.

我试着mb_substr像这样使用:

$s = 'abcdefg';
for ($i …
Run Code Online (Sandbox Code Playgroud)

php string

38
推荐指数
7
解决办法
4万
查看次数

strrev()函数在Linux中不可用吗?

我试着用代码编写代码strrev().我包括<string.h>但仍然得到一个"未定义的引用strrev"错误.

我发现strrev()根本没有手册页.为什么?

Linux不支持strrev()吗?

c string

32
推荐指数
3
解决办法
6万
查看次数

如何反转std :: string?

我试图弄清楚temp当我用二进制数字读取字符串时如何反转字符串

istream& operator >>(istream& dat1d, binary& b1)    
{              
    string temp; 

    dat1d >> temp;    
}
Run Code Online (Sandbox Code Playgroud)

c++ string binary reverse

28
推荐指数
2
解决办法
12万
查看次数

"就地"是什么意思?

字符串中的反转单词(单词由一个或多个空格分隔).现在就地进行.

就地是什么意思?

semantics

22
推荐指数
3
解决办法
1万
查看次数

如何反转UTF-8字符串?

最近,有人询问了一种在C中反转字符串算法.在处理非单字节字符串时,大多数提议的解决方案都存在问题.所以,我想知道什么是专门处理utf-8字符串的好算法.

我提出了一些代码,我将其作为答案发布,但我很高兴看到其他人的想法或建议.我更喜欢使用实际代码,因此我选择了C#,因为它似乎是本网站中最流行的语言之一,但我不介意你的代码是否是另一种语言,只要它可以合理任何熟悉命令式语言的人都能理解.而且,由于这是为了看看这样的算法如何在低级别实现(通过低级别我只是意味着处理字节),我们的想法是避免使用库来实现核心代码.

笔记:

我对算法本身,它的性能以及它如何进行优化感兴趣(我的意思是算法级优化,而不是用++ i替换i ++等等;我对实际的基准测试也不感兴趣).

我并不是要在生产代码中实际使用它或"重新发明轮子".这只是出于好奇和锻炼.

我正在使用C#字节数组,所以我假设您可以获得字符串的长度,而不会运行字符串直到找到NUL.也就是说,我没有考虑到找到字符串长度的复杂性.但是,如果你正在使用C语言,你可以在调用核心代码之前使用strlen()来解决这个问题.

编辑:

正如Mike F指出的那样,我的代码(以及此处发布的其他人的代码)并不处理复合字符.那些有些信息在这里.我不熟悉这个概念,但是如果这意味着存在"组合字符",即只与其他"基本"字符/代码点组合有效的字符/代码点,那么这样的查找表当反转时,字符可用于保持"全局"字符("基本"+"组合"字符)的顺序.

string algorithm performance utf-8

13
推荐指数
4
解决办法
9188
查看次数

快速向后转动大块内存

我需要以相反的顺序重写大约4KB的数据,在位级(最后一个字节的最后一位成为第一个字节的第一位),尽可能快.有没有聪明的小册子呢?

理由:数据是嵌入式设备中LCD屏幕的显示内容,通常以屏幕处于肩膀水平的方式定位.屏幕有"6点钟"的方向,可以从下面看 - 就像平躺或挂在眼睛上方.这可以通过将屏幕旋转180度来固定,但是我需要从屏幕的左上角开始反转屏幕数据(由库生成),即1位= 1像素.CPU功能不是很强大,设备已经有足够的工作量,加上一秒钟的几帧,所以性能是个问题.RAM不是那么多.

编辑:单核,ARM 9系列.64MB,(缩小到32MB以后),Linux.数据通过8位IO端口从系统存储器推送到LCD驱动器.

CPU为32位,在字长方面的性能要比字节级高得多.

c optimization performance

13
推荐指数
4
解决办法
1565
查看次数

为什么交换不在C++中使用Xor操作

我已经了解到Xor操作可用于实现有效的交换功能.像这样:

template<class T>
void swap(T& a, T& b)
{
    a = a^b;
    b = a^b;
    a = a^b;
}
Run Code Online (Sandbox Code Playgroud)

但是我可以在互联网上找到的交换实现基本上是这样的:

template<class T>
void swap(T& a, T& b)
{
    T temp(a);
    a = b;
    b = temp;
}
Run Code Online (Sandbox Code Playgroud)

似乎编译器没有为上面的两个表单生成相同的代码,因为我在VC++ 2010上测试了它,第一个更快地完成了工作(并且比std :: swap更快).第一个是便携式还是其他任何问题?随意纠正我的任何错误,因为我不是英语本地人,不擅长C++.

c++ swap xor premature-optimization micro-optimization

11
推荐指数
2
解决办法
3045
查看次数

使用指针修改字符串时发生分段错误?

上下文

我正在学习C,我正在尝试使用指针来反转字符串.(我知道你可以使用一个数组;这更多的是关于学习指针.)

问题

尝试运行下面的代码时,我不断遇到分段错误.海湾合作委员会似乎不喜欢这*end = *begin;条线.这是为什么?

特别是因为我的代码几乎与另一个问题中讨论的非邪恶C函数相同

#include <stdio.h>
#include <string.h>

void my_strrev(char* begin){
    char temp;
    char* end;
    end = begin + strlen(begin) - 1;

    while(end>begin){
        temp = *end;
        *end = *begin;
        *begin = temp;
        end--;
        begin++;
    }
}

main(){
    char *string = "foobar";
    my_strrev(string);
    printf("%s", string);
}
Run Code Online (Sandbox Code Playgroud)

c string reverse pointers

10
推荐指数
2
解决办法
4万
查看次数

C指针算术

这是我不理解的代码,它只是反转一个字符串.

#include <stdio.h>

void strrev(char *p)
{
  char *q = p;
  while(q && *q) ++q;
  for(--q; p < q; ++p, --q)
    *p = *p ^ *q,
    *q = *p ^ *q,
    *p = *p ^ *q;
}

int main(int argc, char **argv)
{
  do {
    printf("%s ",  argv[argc-1]); strrev(argv[argc-1]);
    printf("%s\n", argv[argc-1]);
  } while(--argc);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我不理解的唯一一段代码就是这一段:while(q && *q) ++q;它用于查找eos.是不是一样while(*q) ++q;,因为q永远不会是0?代码的作者如何确定q*q将会是0?

此代码来自这个问题:如何在C或C++中反转字符串?

c pointers

8
推荐指数
2
解决办法
6703
查看次数

用c ++反转阿拉伯字符串

如何使用C++反转阿拉伯字符串?例如,كلمة的反面是ةملك.阿拉伯字母的形状根据单词中的位置而不同.(最初,内侧或最后的单词).还有其他规则来连接阿拉伯字母吗?

c++ string unicode

6
推荐指数
1
解决办法
953
查看次数