【移动应用开发技术】怎么在iOS中翻转字符串_第1页
【移动应用开发技术】怎么在iOS中翻转字符串_第2页
【移动应用开发技术】怎么在iOS中翻转字符串_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在iOS中翻转字符串

怎么在iOS中翻转字符串?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。字符串翻转作为算法题已经是一个不能再基础的问题了,无非就是逆序遍历、双指针遍历、递归,代码也能分分钟写出来:void

strrev(char

*str)

{

size_t

start

=

0;

size_t

end

=

start

+

strlen(str)

-

1;

while

(start

<

end)

{

char

ch

=

str[start];

str[start++]

=

str[end];

str[end--]

=

ch;

}

}OK,上面的代码放到LeetCode上绝对是能AC的,但是实际情况中能AC吗?答案肯定是不能的!一个靠谱的字符串翻转算法题放到LeetCode上至少是Medium的难度。首先我们知道字符串有编码规则,比如我们常用的UTF-8,Windows早期采用的UTF-16(函数名有W后缀的API采用这种编码)等等...对于英文字母等ASCII字符的情况,UTF-8和ASCII编码都是一个字节,所以上述的方法没有太大问题。然而对于有中文的情况,一个中文字符在UTF-8中会占3个字节,如果单纯的按字节翻转就会出现乱码。那怎么解决呢?最简单的方法就是使用mbstowcs函数将char*类型的字符串转换为wchar_t类型的宽字符串,wchar_t这个类型在Linux、UNIX系统上占4个字节,在Windows上占2个字节。4个字节意味着字符将用UTF-32来编码,不管是汉字还是Emoji都能存放下来。但对于2个字节,也就是UTF-16,汉字是能表示,但是Emoji这类位于辅助平面码位的字符需要两个码元来表示,本文的方法就暂不适用了。首先我们来看一下改进版的字符串翻转:static

void

strrev2(char

*str)

{

setlocale(LC_CTYPE,

"UTF-8");

size_t

len

=

mbstowcs(NULL,

str,

0);

wchar_t

*wcs

=

(wchar_t

*)

calloc(len

+

1,

sizeof(wchar_t));

mbstowcs(wcs,

str,

len

+

1);

size_t

start

=

0;

size_t

end

=

start

+

len

-

1;

while

(start

<

end)

{

wchar_t

wc

=

wcs[start];

wcs[start++]

=

wcs[end];

wcs[end--]

=

wc;

}

wcstombs(str,

wcs,

wcstombs(NULL,

wcs,

0));

free(wcs);

}使用mbstowcs这类转换函数首先需要设置字符串的系统编码,不然函数无法确定你传入的char*是个什么东西,本文中不管是源码还是系统环境的stdI/O都采用UTF-8编码。接下来我们调用一次mbstowcs不传入目标地址和字符长度,这可以让函数直接计算所需的wchar_t个数并返回回来以便我们申请内存。然后就是基于wchar_t的一个常规字符串翻转了,最后别忘了转换回去,释放内存即可。Bonus:Cocoa开发中的字符串翻转作为iOS开发者,当然还要考虑OC中的解决方法了。方案1:通过API遍历子串,然后前向插入到新的NSMutableString中。-

(NSString

*)my_stringByReversing

{

NSMutableString

*reversed

=

[NSMutableString

stringWithCapacity:self.length];

NSRange

range

=

NSMakeRange(0,

self.length);

[self

enumerateSubstringsInRange:range

options:NSStringEnumerationByComposedCharacterSequences

usingBlock:^(NSString

*

_Nullable

substring,

NSRange

substringRange,

NSRange

enclosingRange,

BOOL

*

_Nonnull

stop)

{

[reversed

insertString:substring

atIndex:0];

}];

return

[reversed

copy];

}这种方法是效果最好的,它会将ComposedEmoji(如?‍?‍?‍?)也提取出来,因为这类Emoji是由多个Unicode字符组合而成的,所以即便是4个字节的wchar_t也容纳不下。但这种方法的弊端就是开销太大,稍后我们做一个比较。方案2:通过API获取到CString,然后用文章开头所述的方法处理,再重新用处理后的CString构造NSString。-

(NSString

*)my_stringByReversing2

{

NSUInteger

length

=

[self

lengthOfBytesUsingEncoding:NSUTF8StringEncoding];

char

*buf

=

calloc(length

+

1,

1);

[self

getCString:buf

maxLength:length

+

1

encoding:NSUTF8StringEncoding];

strrev2(buf);

NSString

*reversed

=

[NSString

stringWithCString:buf

encoding:NSUTF8StringEncoding];

free(buf);

return

reversed;

}这种方法的好处就是高效,经测试,它与遍历的方法相比有100多倍的性能提升,但是问题就是无法处理复杂的Emoji。两种方法,在使用中需要好好衡量一下。方案3:Swift。Swift的String的基本单位是Character,它是UnicodeScalar的集合,表示了一个可渲染的字符,包括ComposedEmoji。并且,String是实现了BidirectionalCollection,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论