题目描述
编写一个程序,将输入字符串中的字符按如下规则排序(一个测试用例可能包含多组数据,请注意处理)。
规则 1 :英文字母从 A 到 Z 排列,不区分大小写。
如,输入: Type 输出: epTy
规则 2 :同一个英文字母的大小写同时存在时,按照输入顺序排列。
如,输入: BabA 输出: aABb
规则 3 :非英文字母的其它字符保持原来的位置。
如,输入: By?e 输出: Be?y
样例:
输入:
A Famous Saying: Much Ado About Nothing(2012/8).
输出:
A aaAAbc dFgghh : iimM nNn oooos Sttuuuy (2012/8).
思路:将字符串转换为字符数组,同时替换字母为-1并保存字母数组,对字母数组采取稳定排序,使用排序后的字母数组依次用来填充字符数组中的-1
<? function transform( $input ) { $len = strlen($input); $ret = array(); $chars = array(); $rule1 = array(); for ($i = 0; $i < $len; $i++) { $number = ord($input[$i]); if (($number > 64 and ($number < 91)) or ($number > 96 and ($number < 123))) { array_push($ret, -1); array_push($chars, $input[$i]); array_push($rule1, strtolower( $input[$i] )); } else { array_push($ret, $input[$i]); } } //对chars数组进行稳定排序 $rule2 = array_keys($chars); array_multisort($rule1, SORT_ASC, $rule2, SORT_ASC, $chars); $j = 0; for ( $i = 0; $i < sizeof( $ret ); $i++ ) { if ( $ret[$i] == -1 ) { $ret[$i] = $chars[$j++]; } } return implode( "",$ret ); } while ($input = trim(fgets(STDIN))) { print transform( $input )." "; }