輸入一個1~1億的數字,打印中文,注意特殊情況
<?php
$CN = array("零","一","二","三","四","五","六","七","八","九");
$UNIT = array(1=>"十","百","千","萬");
$str = $argv[1];
$str = (double)$str; //除掉前面多余的零
$len = strlen($str);
if($len > 10)
echo "長度不能大於10\n";
else
echo n2cn($str);
function n2cn($str)
{
global $CN,$UNIT;
preg_match_all('/./is',$str,$m); //取出數字
$str = array_reverse($m[0]);
$str = array_chunk($str,4); //按位分段
$count = count($str);
foreach($str as $key => $num){
$word[] = part($num,$key); //分段處理
}
$word = array_reverse($word);
$word = join("",$word);
//$word = str_replace("一十","十",$word); //一十和十的問題
return $word;
}
function part($str,$mark) //分段處理算法
{
global $CN,$UNIT;
$str = array_reverse($str);
$count = count($str);
foreach($str as $key => $num){
$data = next($str); //看下個數字是不是0
if($num!=0){
$word.= $CN[$num];
$word.= $UNIT[$count-$key-1];
}
elseif($data!=0){ //如果下個數字是零那就只加一個零
$word.= $CN[$num];
}
}
if($mark == 1 && $word!="") $word.="萬"; //萬位
if($mark == 2 && $word!="") $word.="億"; //億位
if($mark == 3 && $word!="") $word.="萬"; //億的萬位
return $word;
}
?>
看到隨便寫一個玩玩..
02020202 二百零二萬零二百零二
22002020 二千二百萬二千零二十
//1. 用戶密碼六位數,不能大於六位而不能小於六數,數字值正則為[0-9],請用PHP寫出有幾種可能性,並做暴力破解;
- function dePassword($pwd) {
- $tmp = array('000000', '555555', '999999');
- for ($i = 0; $i < 3; $i++) {
- if ($pwd == $tmp[$i]) return $tmp[$i];
- }
- return $pwd < $tmp[1] ? getPwd(0, $pwd, $tmp) : getPwd(1, $pwd, $tmp);
- }
- function getPwd($i, $pwd, $tmp) {
- $half = ceil(($tmp[$i] + $tmp[$i + 1]) / 2);
- if ($half == $pwd) {
- return $half;
- } elseif ($half > $pwd) {
- return returnI($pwd, $tmp[$i], $half);
- } else {
- return returnI($pwd, $half, $tmp[$i + 1]);
- }
- }
- function returnI($pwd, $start, $end){
- for ($i = $start + 1; $i < $end; $i++) {
- if ($i == $pwd) return $i;
- }
- }
- $pwd = '000089';
- printf('%06s', dePassword($pwd));
//2.牛年求牛:有一母牛,到4歲可生育,每年一頭,所生均是一樣的母牛,到15歲絕育,不再能生,20歲死亡,問n年后有多少頭牛
- function niunum($n) {
- static $num = 1;
- for ($i = 1; $i <= $n; $i++) {
- if ($i >= 4 && $i < 15) {
- $num++;
- niunum($n - $i);
- }
- if ($i == 20) $num--;
- }
- return $num;
- }
- echo niunum(10);
//3.合並多個數組,不用array_merge(),思路:遍歷每個數組,重新組成一個新數組。
- function unionArray($a, $b) {
- $re = array();
- foreach ($a as $v) $re[] = $v;
- foreach ($b as $v) $re[] = $v;
- return $re;
- }
- print_r(unionArray(array(1,2,4,5,'s'), array(2,5,7,'c','d')));
/*4.二分法查找
*思路:以數組中某個值為界,再遞歸進行查找,直到結束。
*/
- $a = array(1,4,2,5,6,7,0,8,3);
- function find($arr, $start, $end, $key) {
- sort($arr);
- $mid = ceil(($start + $end) / 2);
- if ($arr[$mid] == $key) {
- return $mid;
- } elseif ($arr[$mid] > $key) {
- return find($arr, $start, $mid - 1, $key);
- } else {
- return find($arr, $mid + 1, $end, $key);
- }
- }
- echo find($a, 0, count($a), 2);
//5.冒泡排序法
- function mSort($a) {
- $len = count($a);
- for ($i = 0; $i < $len - 1; $i++) {
- for ($j = $i; $j < $len; $j++) {
- if ($a[$i] > $a[$j]) {
- $tmp = $a[$i];
- $a[$i] = $a[$j];
- $a[$j] = $tmp;
- }
- }
- }
- return $a;
- }
- print_r(mSort($a));
//6.楊輝三角
- $a = array();
- for ($i = 0; $i < 6; $i++) {
- $a[$i][0] = 1;
- $a[$i][$i] = 1;
- }
- for ($i = 2; $i < 6; $i++) {
- for ($j = 1; $j < $i; $j++) {
- $a[$i][$j] = $a[$i-1][$j-1] + $a[$i-1][$j];
- }
- }
- for ($i = 0; $i < 6; $i++) {
- for ($j = 0; $j <= $i; $j++) {
- echo $a[$i][$j].' ';
- }
- echo '<br/>';
- }
/*7.給兩個字符串s1,s2,定義字符串之間的距離d(s1,s2)為通過如下操作使兩個字符串一樣的最少次數;
1.替換其中一個字符
2.刪除一個字符
3.插入一個字符
例如:kooxoo.com與kooxoo.cn的距離為2,12344與1244的距離為1,給出任意兩個字符串,求其距離,要求給出算法並分析時間復雜度
方法一:采用levenshtein($str1, $str2)內置函數
*/
-
- echo levenshtein('kooxoo.com', 'kooxoo.cn');
- echo "<br />";
-
- function levdis($s,$t){
- $n=strlen($s);
- $m=strlen($t);
- $matrix=array(range(0,$n+1),range(0,$m+1));
- $ret=0;
- if ($n==0){
- return $m;
- }
- elseif ($m==0){
- return $n;
- }
- for ($i=0;$i<=$n;$i++) {
- $matrix[$i][0]=$i;
- }
- for ($j=0;$j<=$m;$j++) {
- $matrix[0][$j]=$j;
- }
- for ($i=1;$i<=$n;$i++) {
- for ($j=1;$j<=$m;$j++) {
- if ($s[$i-1]==$t[$j-1]) {
- $cost=0;
- }else{
- $cost=1;
- }
- $matrix[$i][$j]=min($matrix[$i-1][$j]+1, $matrix[$i][$j-1]+1, $matrix[$i-1][$j-1]+$cost);
- }
- }
- return $matrix[$n][$m];
- }
- echo levdis('kooxoo.com', 'kooxoo.cn');
//8.把數組array(12,34,56,32) 轉化為 array(1,2,3,4,5,6,3,2)
- function changeArr($arr) {
- return str_split(implode('', $arr));
- }
- print_r(changeArr(array(12,34,56,32)));
/*9.把數字1-1億換成漢字表述,如:123->一百二十三
*/
- function intToCnstr($intval) {
- $cnNum = array('零','一','二','三','四','五','六','七','八','九');
- $cnUnit = array('','十','百','千','萬','億');
- $reCnStr = '';
- $intval = intval($intval);
- if ($intval < 10 && $intval >= 0) {
- $reCnStr .= $cnNum[$intval];
- } elseif ($intval == 1000000000) {
- $reCnStr .= $cnNum[1].$cnUnit[5];
- } elseif ($intval < 0 || $intval > 1000000000) {
- $reCnStr .= '';
- } else {
- $str = strval($intval);
- $len = strlen($str);
- for ($i = 0; $i < $len; $i++) {
- if (intval($str{$i}) != 0) {
- $reCnStr .= $cnNum[intval($str{$i})];
- $j = $len - 1 - $i;
- if ($j < 5) {
- $reCnStr .= $cnUnit[$j];
- } elseif ($j >=5 && $j <= 8) {
- $reCnStr .= $cnUnit[$j - 4];
- }
- } else {
- if ($i > 0 && $str{$i} != $str{$i - 1}) $reCnStr .= $cnNum[0];
- }
- }
- }
- return $reCnStr;
- }
- echo intToCnstr(9912016);
/*10.將一張考試卷的內容,看成一個文本文件,題目形如: 1.1.。。。。。。。(3分)(假設非空行最后字符均為空格)
*要求實現檢索出題號及其分值,並輸出類似如下的:
*1.1 3分
*1.2 3分
*1.3 5分
*/
- $txt = <<<EOD
- 1.1請問我們(3分)
- 123234324
- 1.2我們收到收到(4分)
- 適當方式的
- 1.3test(4分)
- EOD;
- $match_1 = $match_2 = $match = array();
- preg_match_all("//d+/./d/S+/", $txt, $strArr);
- foreach ($strArr[0] as $k => $v) {
- preg_match('/^/d+/./d+/', $v, $match_1[$k]);
- preg_match('//d+分/', $v, $match_2[$k]);
- }
- for ($i = 0; $i < count($match_1); $i++) {
- $match[$i] = $match_1[$i][0].' '.$match_2[$i][0];
- }
- print_r($match);
/*11.在一組數中,要求插入一個數,按其原來順序插入,維護原來排序方式。
*思路:找到比要插入數大的那個位置,替換然后把后面的數后移一位。
*/
- function insertNum($num, $arr) {
- $len = count($arr);
- if ($arr[$len - 1] <= $num) {
- $arr[$len] = $num;
- return $arr;
- }
- for ($i = 0; $i < $len - 1; $i++) {
- if ($arr[$i] > $num) {
- $t1 = $arr[$i];
- $arr[$i] = $num;
- for ($j = $i + 1; $j <= $len; $j++) {
- $t2 = $arr[$j];
- $arr[$j] = $t1;
- $t1 = $t2;
- }
- break;
- }
- }
- return $arr;
- }
- print_r(insertNum(3, array(1,2,3,4,5)));
/*12.對一組數進行排序(快速排序算法)。
*思路:通過一趟排序分成兩部分,然后遞歸對這兩部分排序,最后合並。
*/
- function quickSort($arr) {
- if (count($arr) <= 1) return $arr;
- $key = $arr[0];
- $left = $right = array();
- $len = count($arr);
- for ($i = 1; $i < $len; $i++) {
- if ($arr[$i] <= $key) $left[] = $arr[$i];
- else $right[] = $arr[$i];
- }
- $left = quickSort($left);
- $right = quickSort($right);
- return array_merge($left, array($key), $right);
- }
- print_r(quickSort(array(1,3,23,5,234,65,6)));
/*字符:0-9 或 a-z
*長度:1
*那就生成0,1,2,3,4,5,6,7,8,9
*長度:2,就會生成00-99
*/
-
- function echoStr($len = 1, $type='num') {
- $str = '';
- if ($len < 1) return ;
- if ($type == 'num') {
- $ascStart = 48;
- $ascEnd = 57;
- } elseif ($type == 'char') {
- $ascStart = 97;
- $ascEnd = 122;
- } else {
- return ;
- }
- for ($i = $ascStart; $i <= $ascEnd; $i++) {
- for ($j = 1; $j <= $len; $j++) $str .= chr($i);
- $str .= ',';
- }
- return substr($str, 0, -1);
- }
-
- function echoStr2($len) {
- $str = '';
- $char = '1234567890qwert!@#$';
- $cLen = strlen($char);
- for ($i = 0; $i < $cLen; $i++) {
- for ($j = 1; $j <= $len; $j++) {
- $str .= $char[$i];
- }
- $str .= ',';
- }
- return substr($str, 0, -1);
- }
- echo echoStr(3, 'num')."<br />";
- echo echoStr(2, 'char')."<br />";
- echo echoStr2(2);
/*已知字符串 $string = "2dsjfh87HHfytasjdfldiuuidhfcjh";
*找出 $string 中出現次數最多的所有字符。
*/
-
- $string = "2dsjfh87HHfytasjdfldiuuidhfcjh";
- $re = count_chars($string, 1);
- print_r(array_map("chr", array_keys($re, max($re))));
- echo "<br />";
-
- $b = array_count_values(str_split($string));
- print_r(array_keys($b, max($b)));
-
- function delete_array_element($array, $i) {
- $len = count($array);
- for ($j=$i; $j<$len; $j++){
- $array[$j] = $array[$j+1];
- }
- array_pop($array);
- return $array;
- }
- print_r(delete_array_element(array(1,2,3,4,5), 2));