面试中常遇到问字符翻转算法的实现,我做了如下整理.
自带函数介绍
字符串反转函数 [strrev]
php 自带反转字符串函数 (PHP4,PHP5,PHP7)
string strrev ( string $string ) 参数,string待反转的原始字符串; 返回值,string 反转后的字符串。
范例
Example #1 使用 strrev() 反转字符串
<?php
echo strrev("Hello world!"); // 输出 "!dlrow olleH"
?>
源码
PHP_FUNCTION(strrev)
{
zend_string *str;
char *e, *p;
zend_string *n;
ZEND_PARSE_PARAMETERS_START(1, 1)
Z_PARAM_STR(str)
ZEND_PARSE_PARAMETERS_END();
n = zend_string_alloc(ZSTR_LEN(str), 0);
p = ZSTR_VAL(n);
e = ZSTR_VAL(str) + ZSTR_LEN(str);
while (--e >= ZSTR_VAL(str)) {
*p++ = *e;
}
*p = '\0';
RETVAL_NEW_STR(n);
}
循环遍历法
1.1 for ++
function revStr11($str)
{
if ($str == '') {
return NULL;
}
$len = strlen($str);
$new_str = '';
for($i=1;$i<=$len;$i++){
$new_str .= $str[$len-$i];
}
return $new_str;
}
1.2 for –
function revStr12($str)
{
if ($str == '') {
return NULL;
}
$len = strlen($str) - 1;
$new_str = '';
for($i=$len;$i>=0;$i--){
$new_str .= $str[$i];
}
return $new_str;
}
首尾互换法
2.1
function revStr21($str)
{
if ($str == '') {
return NULL;
}
$len = strlen($str);
$idx = $len / 2;
for ($i=0;$i<$idx;$i++){
$tmp = $str[$i];
$end = $len - 1 - $i;
$str[$i] = $str[$end];
$str[$end] = $tmp;
}
return $str;
}
PHP函数组合处理
3.1 substr函数处理-递归
function revStr31($str)
{
if(strlen($str)>0){
revStr31(substr($str,1));
}
echo substr($str,0,1);
return NULL;
}
3.2 substr函数处理-循环
function revStr32($str)
{
if ($str == '') {
return NULL;
}
if(strlen($str) == 1){
return $str;
}else{
$len = strlen($str);
$rev_str = "";
for($i=1; $i<=$len; $i++){
$rev_str .= substr($str,-$i,1);
}
return $rev_str;
}
}
3.2 str_split函数 + 循环
function revStr33($str)
{
$rev_str = '';
$str_arr = str_split($str);
$arr_len = count($str_arr);
for ($i=0; $i <= $arr_len; $i++) {
$rev_str .= $str_arr[$arr_len - $i];
}
return $rev_str;
}
3.2 str_split函数 + array_reverse函数 + implode函数
function revStr35($s)
{
return implode('',array_reverse(str_split($s)));
}
正则表达式处理
注:该方式也可以用来处理中文
4.1 array_reverse函数 + preg_split函数 + join函数
function revStr41($str)
{
return join("",array_reverse(preg_split("//u",$str)));
}
4.1 array_reverse函数 + preg_match_all函数 + join函数
function revStr42($str)
{
preg_match_all('/./us', $str, $ar);
return join('',array_reverse($ar[0]));
}
中文反转实现
5.1 mb_substr函数 + for循环
function revstr51($str, $encoding = 'UTF-8')
{
$len = mb_strlen($str) - 1;
$res = '';
for ($i = $len; $i>=0; $i--){
$res.= mb_substr($str,$i,1,$encoding);
}
return $res;
}
5.2 mb_substr函数 + krsort函数 + implode函数
function revStr52($str, $encoding = 'UTF-8')
{
//判断输入的是不是utf8类型的字符,否则退出
if(!is_string($str) || !mb_check_encoding($str,$encoding)){
return NULL;
}
$arr = [];
$len = mb_strlen($str,$encoding);
for($i=0; $i<$len; $i++){
$arr[] = mb_substr($str,$i,1,$encoding);
}
//反转字符串
krsort($arr);
//拼接字符串
$rev_str = implode('',$arr);
return $rev_str;
}
5.3 mb_substr函数 + while循环
function revStr53 ($str, $encoding = 'UTF-8')
{
$len = mb_strlen($str, $encoding);
$rev_str = '';
while($len-- > 0) {
$rev_str .= mb_substr($str, $len, 1, $encoding);
}
return $rev_str;
}
本文由 MeiLe 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:2017-09-30 20:06:42