有人来讨论技术吗?如何高效的将字符串中的大小写互换?
就是把字符串中的大写全换成小写、小写全换成大写。
除了逐个字符判断+替换,还有什么更快速高效的方法吗?
不限语言,最好是 php 或 js 的,仅仅提供思路讨论也行。
就是把字符串中的大写全换成小写、小写全换成大写。
除了逐个字符判断+替换,还有什么更快速高效的方法吗?
不限语言,最好是 php 或 js 的,仅仅提供思路讨论也行。
不过刚刚在 https://godbolt.org/ 试了一下,用 ctype.h 的 isupper islower toupper tolower,编译出来并没有内联,而是 call 这几个函数。觉得 call 影响性能的话还是直接写判断和加减比较好。
你可以直接翻转第六位,就是异或个 0010 0000
这个 0010 0000 在 ASCII 里面代表空格,所以你直接异或一个空格就可以。当然你得首先判断它是字符。
ASCII 当初就是这么设计的,大小写基本都是对称的位置。
另外虽然 ASCII 用来编码字符,但是对应数字那部分都是 0011 开头的。你把这部分 mask 掉剩下的就是字符所表示的实际数值。
兼容的 UTF8 也是一样的。不过正常来说,你要做一个完美的大小写转换,需要先判断 culture 才行。不过简单的可以就这么直接做了。
需要遍历就是 O(n) 的
<img alt=”” src=”https://i.loli.net/2020/01/29/4lLg63t1eAhy7qT.png”>
查表+unrolling 是我能想到最快的。
不可能存在低于 O(n) 时间复杂度( n 为字符串长度)的方法。
1. 假设存在这样的算法,不需要遍历所有字符串即可完成替换。
2. 设立目标字符串 A,选定其中一个字符 a 为此算法无需遍历的。将 a 的大小写翻转,得到新字符串 A’
3. 因为算法没有遍历 a,所以算法对 A 与 A’得到的结果应该是一样的,不符合实际情况。
4. 所以不存在这样的算法。
这样不用比较,没有分支,也许会比较快,具体怎么样你要跑跑才知道。
这个方法稍微改一下还可以用于 utf-8 编码的文本。这次自定义的表不是存 ascii 字符了,而是在大小写字母的位置放 0x20,其他位置放 0,操件由直接赋值改为异或后赋值(在许多机器上 a ^= b 和 a = b 的执行效率是一样的),原理上面有提到了。