您将字符串反转用于什么用途?[关闭]


15

在PHP中是strrev(),在Rails中是.reverse,但是大多数语言没有任何字符串反向功能。有些具有可用于字符的数组反转功能。我以为这一定是一个重大的疏忽,但是后来发生在我身上,您实际将反向字符串用作什么?

我唯一能想到的是在演示和课程中启用“ Hello World!”。变成“!dlroW olleH”。

我的问题是;反转字符串有用途还是完全没有意义?

附录

我已经预料到会有更多答案,但并非所有答案都完全是学术性的。我本来会花钱的,没有人能提出一个合理的例子。我也认为我不会学到任何新东西,但Mark Canlas的正则表达式建议非常出色,我期待着有机会证明自己。谢谢大家。


@clockworkgeek-如果您要求应聘者以他们喜欢的语言进行字符串反转,您会惊讶于有多少人没有提到您提到的基本功能。那么有多少人无法提出一个循环来自己实现。
justkt 2010年

@justkt-这是一个尚待解决的其他问题,但可能是TopCoder的主题。
clockworkgeek 2010年

6
发送文本消息,在驾驶时可以在后视镜中读取该消息,因此警察不会注意到。
JeffO 2010年

@justkt-如果我必须编写一个迭代循环来做,那么我将从两端开始交换字符,直到到达中间为止。但是,如何交换两个值?这简直就是我所得到的最好的答案:a ^= b; b ^= a; a ^= b;
clockworkgeek 2010年

1
我使用字符串反转来反转字符串;)
Muad'Dib 2010年

Answers:


19

Sexegers

有时,通过反转输入字符串并以其他方式解决问题,可以更轻松地编写涉及正则表达式的问题。

技术由教我Perl的人提供。

Sexeger在PerlMonks上


谢谢。查找最后的东西非常方便的技巧。适当注意。
clockworkgeek 2010年

我已经做了多年了。帮助解析电子邮件地址。
萨尔

23

好吧,这是一个嘲讽的答案。

“回到过去”,我拥有一个Unix盒,它有一个有序的英语单词字典文件,用于拼写检查。

我通过反转字典中的所有单词,对其进行排序,然后再次反转来制作了一个新文件。结果是从右到左排序的单词列表。

因此,如果您在其中搜索一个单词,那么该单词旁边将是结尾相似的单词。因此,很容易写小诗!

当您看到什么韵律与什么韵律时,您真的可以自娱自乐。


13

我从事编码器/开发人员/系统管理员已有10年了,在现实生活中我不记得曾经需要进行字符串反转。

我能想到的唯一直接用例是基于数字的转换:天真地完成了,该过程返回了一个反向字符串。但是,通过一些数学运算,您可以预先计算所需的空间量,因此您可以从头开始填充缓冲区。


1
数学运算可能比反转字符串更昂贵,因此在平台(ARM,MIPS,x86)进行基准测试后,您可以使用字符串反转。也许。
Zan Lynx 2010年

您可以memmove从头开始填充缓冲区,并在结束时使用a到头。它可能比计算log(n)/ log(base)来计算所需的位数便宜。
PatrickSchlüter17年

12
public bool IsPalindrome(string toCheck)
{
    return toCheck == toCheck.Reverse();
}

1
是的-实际上,我们进行了一次面试筛选,其中候选人编写了回文检查程序,而大多数人都是这样做的。但是,当候选人从0进行迭代n/2并比较另一端的字符时,我会更喜欢它。
妮可

@Renesis:您也可以这样做:while ( (*p == *q) && (p <= q) {p++; q--} return p > q;用C和其他指针语言设置p的字符串开头,q的字符串结尾。
Michael K 2010年

4
我想虽然“回文检查器”不是特别有用,但是“编写回文检查器”至少有一个目的。
clockworkgeek 2010年

2
在一次采访中,他们要求我反转一个字符串,然后他们说“记住这个没有string.Rverse()。所以我只是将字符串转换为字符数组,然后执行Array.Reverse
Jack Marchetti 2010年

这是一个相当利基的用途,而您通常不会说其中一个值得在语言/图书馆中使用!
Dan Diplo

8

面试!

反转字符串(是否在原位)是基本编程知识中非常常见的面试问题。缺少这些内置功能的语言将很难面试。候选人实际上必须知道一些事情。1个


1:这是嘲讽的答案。


6

我曾见过这样的情况,其中桌面应用程序正在与嵌入式设备通信,并不断切换字节序字节序,并且数据以字符串形式移动。那就是我的意思。

我不会为该应用程序使用字符串,但这就是原来的样子.....


为此答案+1。至少这是一个实际的示例,尽管我也可能会选择另一种方式,也许是通过选择端序不同的原始类型。
clockworkgeek

5
<span style="unicode-bidi: bidi-override; direction:rtl;">
    <?php echo strrev($emailaddress); ?>
</span>

这不是混淆电子邮件地址的最佳解决方案,因为当您将其添加到剪贴板时,它仍然被撤消。而且,如果它变得流行,它将很快被电子邮件抓取机器人检测到。

仍然有人建议


1
在整篇文章中,只使用了一个句子就对使用中最流行的混淆进行了编码。
clockworkgeek 2010年

1
@clockworkgeek,它可能是一种流行的方法,但是恕我直言,它是最糟糕的有效解决方案-并非超级容易生成,没有嵌入HTML(速度,图像存储,服务器负载),看起来不合适,无法样式化使用CSS,以及与字符串反转一样的糟糕用户体验,必须记住并重新输入。可能还有其他我没有想到的问题。
妮可,2010年

令人奇怪的是,使用AT和DOT(对于收割机而言最容易解码)在防止收割方面几乎具有完美的效果。有时保持简单并不是一个坏主意。
Joeri Sebrechts 2010年

5

ASCII并不是遗传信息的最佳编码(您可以将ACGT的基本类型打包为2位)。将它们打包成longlongs数组,每个单词可获得32个遗传“字母”。DNA可能会掉头,因此您必须检查DNA片段是否正向都是测试序列的反向副本。因此,能够反转2位数量的打包字符串对于各种遗传分析非常有用。

作为间谍机构基准测试的一个项目,我能将多头比特(实际上是很长的多头比特)反转多快。一次交换2位的明显方法比不太明显的方法慢得多。这些与就地数组转置的一些精巧算法有关。

Tangurena:您引用的操作称为人口计数。对于位打包数据,相似的要求是前导和尾随零计数。使用位打包数据可以完成很多非常整洁的事情。longlong上的单个操作是64路数据并行,因此,如果您知道自己在做什么,则对于某些类型的计算,您将获得令人难以置信的性能。


有趣的话题,您将如何反转一个字段?
clockworkgeek 2010年

“你将如何反转一个字段?”
欧米茄半人马座2010年

2
一种方法是表查找。您可以使用表对一个字节进行位反转。因此,您可以在单个字节上执行此操作。还有一些方法可以移动几位,然后一次。
欧米茄Centauri 2010年

5

使用反向字符串的任何操作都更容易。

如果将字符串反转,则将整数用作字符串要容易得多。我构建了一些库函数来使用大整数进行数学运算,并使用字符串反转使算术函数更简单。

当然,我只是用它来提出关于Euler项目的答案,但是仍然保留了原始前提。


+1。当使用数字的字符串表示形式时,反向表示形式非常有用。通常标准库会以正常顺序表示数字。
back2dos 2010年

3

对于使用从右到左字母(例如阿拉伯语)而不是从左到右字母的语言,也许是低成本的多语言支持。当然,您必须提防重音字符修改正确的字符...


2

我不知道也许有人急需检查回文 ...

我认为它完全没有用,因为在某些情况下可能需要反转字符串。


接下来的问题是,您何时需要在现实世界中检查回文?再说一次,我只见过有人关心算法课程。
clockworkgeek


我认为可能还有其他用途,但这是特定于领域的。例如,如果字符串搜索针对正向搜索进行了优化,并且您想对最后一次出现进行多次搜索,则可能要先将其反向。不过,这将是一种优化,除非有可证明的情况,否则不应该这样做。我可以设想一种算法,该算法用于生成字符串值的散列,该散列想要使用尾端(如果恰好可以提供更好的散列特性),则可以反转。
Scott Whitlock 2010年

2

在自然语言处理和解析中,有时从头到尾搜索字符串会更容易。字符串反向可以用于调试,也可以用作编写循环的另一种方法(反向转换字符串,然后从索引0循环到n-1)。

另外,有些语言是从右到左编写的,因此,如果您所处的环境无法自然识别LTR / RTL语言,则可以使用字符串反向器。

字符串(在某些语言中)是一个字符数组,但也可能是薪水或存货修改。在遍历这些循环的循环中,您可能会执行一些计算,无论您以何种顺序处理它们都应相同。完美的单元测试将是检查它们的计算是向前还是向后进行计算。对于添加而言,这可能是显而易见的,对于其他更不透明的操作而言,可能并非如此。


1

对于编译器?

这很有趣,但是语言中的大多数符号都会以常见的模式开头。我在这里不是在谈论匈牙利符号,但是如果您考虑名称空间/类,那么许多符号实际上将共享一个公共前缀

myproject::SomeClass::GetFoo
myproject::SomeClass::GetBar

问题是,当执行二进制搜索时,常见的前缀是您最糟糕的事情,因为您最终将一遍又一遍地比较这些前缀。

另一方面,如果向后看字符串,您会发现更多的熵!然后突然之间,通过Trie进行的二进制搜索变得更加强大!

总是让我感到困惑的是,C ++混乱的名称(通过gcc)没有被反转以放置命名空间LAST :)


0

我不时翻转电话号码和某些字符串以进行搜索


0

我唯一能回想起使用字符串反转的情况是,我看到了一个回溯的函数,该函数在解析文件名时使用它来确保“。”。它在文件名中发现的实际上是将文件名与扩展名分开的最后一个点。例如,解析一个文件名,例如data.2010.12.08.dat,您将字符串反向,找到第一个点,从原始字符串的末尾减去该位置,然后取子字符串。我并不是说那是实现此目标的最佳方法,而是那件事。可能是在powerbuilder中,这种功能的错误使用很常见,可以解决各种非显而易见的问题。


0

我使用strrev看到的唯一真正的worls应用程序是将用户密码“不可读”存储在数据库中...

但是我记得在C语言中有一种使用strrev的模式,也许我稍后会提出。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.