一道PHP面试的编程题

请编写一个函数

我们工作里使用的的语言是PHP,希望阁下能以PHP作答。若有困难,亦可使用其他语言完成。如C#、Java、C++、Python、Perl、Ruby等

要求

输入参数–一个字符串,返回一个字符串。
输入是一句英文句子,只有英文字a-z, A-Z、每个字之间仅以一个空格分格,前后没有空格。
返回的是要把每一个字的字母顺序倒转写,但字的顺序和字母的大小写位置则保持不変

示例

输入参数
This is an Apple on eBay

返回
Siht si na Elppa no yAbe
如eBay因为是第二个字母大写,倒写后保持第二个字母的大写。

这样有意义吗?

function revStr$str
{ $str2 = implode" ", array_map"strrev", explode" ", $str; $len = strlen$str; while $len > 0 { $str2{$len - 1} = ord$str{$len - 1} < 97 ? strtoupper$str2{$len - 1} : strtolower$str2{$len - 1}; $len--; } return $str2;
} $str = This is an Apple on eBay;
echo revStr$str;// Siht si na Elppa no yAbe

http://segmentfault.com/q/1010000002547110/a-1020000002547831

先用$arr=explode,$input分割这个字符串,
然后将数组翻过来array_reverse
然后遍历$arr
用$a=substr$arr[0],0,1截取

ifpreg_match/^[a-z]+$/, $a{ echo 小写字母; $a=strtoupper$a
}elseifpreg_match/^[A-Z]+$/, $a{ echo 大写字母; $a = strtolower$a
}

然后拼起来就完成了

我也来一个,比@util的稍微快点:)

function revStr&$str { $offset = 0; $isEnd = false; while!$isEnd{ $spacePos = strpos$str, , $offset; if$spacePos === false{ $spacePos = strlen$str; $isEnd = true; } $wordLen = $spacePos - $offset; $wordLenHalf = $wordLen >> 1; for $j = 0; $j < $wordLenHalf; $j++ { $diff = 0; $charPos = $offset + $j; $charPosRev = $spacePos - $j - 1; $charASCII = ord$str[$charPos]; $charASCIIRev = ord$str[$charPosRev]; $diff += $charASCII <= 90 ? -16 : 16; $diff += $charASCIIRev <= 90 ? 16 : -16; if$diff{ $str[$charPos] = chr$charASCIIRev + $diff; $str[$charPosRev] = chr$charASCII - $diff; }else{ $tmp = $str[$charPos]; $str[$charPos] = $str[$charPosRev]; $str[$charPosRev] = $tmp; } } $offset += $wordLen+1; }
} $str = This is an Apple on eBay;
revStr$str; echo $str;// Siht si na Elppa no yAbe

发表评论

电子邮件地址不会被公开。 必填项已用*标注