生活随笔
收集整理的這篇文章主要介紹了
面试题(程序02)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
給定一個(gè)數(shù)組,將數(shù)組中元素向右移動k個(gè)位置,k是非負(fù)數(shù)。例如:[1,2,3,4,5,6] 和 k=2 。輸出:[5,6,1,2,3,4]要求使用空間復(fù)雜度O(1)的原地算法。 // ***旋轉(zhuǎn)數(shù)組*** rorate=>旋轉(zhuǎn)
$arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19];
function rorate(array $arr ,$k )
{ $len = count ($arr ); if ($k >=$len ){ // $k%$len,那就只需要移動余數(shù)次即可 $k = $k % $len ;} $tmp = array_slice ($arr ,-$k ); // print_r($arr);// print_r($tmp);//還要把截取的那一段刪除 for ($i =$len -$k ;$i <$len ;$i ++){ unset ($arr [$i ]);} // 再把截取的數(shù)字插入到數(shù)組開頭// array_unshift($arr,$tmp);//這樣是吧數(shù)組插入開頭了 for ($j =$k -1;$j >=0;--$j ){ array_unshift ($arr ,$tmp [$j ]);} // 兩個(gè)for循環(huán)可以放到一起 print_r ($arr );}
rorate( $arr ,4); // 把兩個(gè)for循環(huán)放在一起
for ($i =$k -1;$i >=0;$i --){ array_pop ($arr ); array_unshift ($arr , $tmp [$i ]);
} View Code ?
模仿百度搜索框: 1 html代碼:
2 <!DOCTYPE html>
3 <html>
4 <head>
5 <meta charset="utf-8">
6 <title>百度搜索</title>
7 <script src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script>
8 </head>
9 <body>
10 <form action="" method="" enctype="multipart/form-data">
11 <input type="text" name="search" placeholder="輸入...">
12 <input type="submit" value="搜索"><br/>
13 <div class ="list">
14 <ul>
15
16 </ul>
17 </div>
18 </form>
19 </body>
20 <script type="text/javascript">
21 var search = $('input[name="search"]');
22 var list = $('.list>ul');
23 search.keyup(function (){
24 var cont = search.val();
25 $.ajax({
26 type: 'post',
27 data: {cont: cont},
28 dataType: 'json',
29 url: './test.php',
30 success: function (res) {
31 if (res.status){
32 list .find('li').remove();
33 $.each (res.result, function (index, item){
34 list .append('<li>'+item+'</li>');
35 })
36 }else {
37 list .html('<li>'+res.result+'</li>');
38 }
39 },
40 error: function (res) {
41 console.log (res);
42 },
43 })
44 })
45 </script>
46 </html>
47
48 PHP代碼:
49 $arr = ['里', '那里昂多', '里昂', '里那多', '外面', '外太空', '挖行人'];
50 if ($_POST ['cont'] == ''){
51 $data = ['status'=>0, 'result'=>'data is empty'];
52 echo json_encode($data );
53 }else {
54 $pattern = "/".$_POST ['cont']."+/";
55 $r = preg_grep ($pattern , $arr );
56 if ($r ){
57 $res = $r ;
58 }else {
59 $res = array ('暫無數(shù)據(jù)');
60 }
61 $data = ['status'=>1, 'result'=>$res ];
62 echo json_encode($data );
63 } View Code ?
//不知道空間復(fù)雜度為1 是什么情況。但是如果說不考慮空間復(fù)雜度的話,我想到的方法是:1.從數(shù)組末尾截取k個(gè)數(shù)字,然后插入到開頭。 // 2.for循環(huán)k次,從末尾彈出一個(gè)數(shù)字放在開頭
/*如下數(shù)組是學(xué)生成績,用PHP處理使其按照score倒序排序*/ $arr = array( array('name'=>'A','score'=>60), array('name'=>'B','score'=>90), array('name'=>'C','score'=>85), ); 思路:現(xiàn)將這個(gè)二維數(shù)組進(jìn)行遍歷,把score單獨(dú)存到一個(gè)新的數(shù)組score中,下標(biāo)和原來的一一對應(yīng)。然后使用arsort()對score數(shù)組排序(保留健名),然后主要就是利用這個(gè)健名的順序?qū)υS數(shù)組進(jìn)行排序,使用array_keys()獲取排序后的健名存到keys數(shù)組中。對keys數(shù)組遍歷,keys數(shù)組中的值就是二維數(shù)組按需求排序后的下標(biāo)。所以把原來數(shù)組中的值按照鍵名的順序依次取出來重新插入數(shù)組中即可。(二維數(shù)組中即便有其他的值也沒問題)
// 遍歷此數(shù)組,key和val一一對應(yīng),比較val['score']大小同時(shí),記住對應(yīng)的key值。最后按照val['score']排序的時(shí)候,就用key找對應(yīng)的name。
function score_sort(array $arr ) { // 默認(rèn)是二維數(shù)組 if (count ($arr )<=1){ return ;} // 定義一個(gè)數(shù)組用來存放val['score']的值 $score = []; foreach ($arr as $key => $val ){ $score [$key ] = $val ['score']; // 成績對應(yīng)的下標(biāo)就是原數(shù)組對應(yīng)的下標(biāo)//然后我的想法就是對score數(shù)組進(jìn)行排序,并且是保留健名的排序。這樣就還可以找到score中值在原數(shù)組中位置,不會找不到而出錯(cuò)
} arsort ($score ); // 保留健名的倒序排序 print_r ($score ); // 然后獲取score數(shù)組的健名(*順序不能變*),將原來的數(shù)組按照這個(gè)健名排序即可。 $keys = array_keys ($score ); print_r ($keys ); echo '<br><pre>'; // 這里我想到的方法是最笨的方法,沒有想到更好的處理方式-_-#//就是把原來數(shù)組中的值按照鍵名的順序依次取出來重新插入數(shù)組中 $newarr = []; for ($i =0;$i <count ($keys );++$i ){ $index = $keys [$i ]; $newarr [] = $arr [$index ];} return $newarr ;
} print_r (score_sort($arr )); View Code ?
$arr = array( array('name'=>'A','score'=>60,'ddd'=>66), array('name'=>'B','score'=>90,'ccc'=>77), array('name'=>'C','score'=>85,'eee'=>88), array('name'=>'C','score'=>84,'eee'=>88), array('name'=>'C','score'=>58,'eee'=>88), );
有一段文字:"我司有電信AD、AC(已取消)、2018央采AF、WOC等車產(chǎn)品" ,取出這段描述中的英文AD,AC,AF,WOC /* "我司有電信AD、AC(已取消)、2018央采AF、WOC等車產(chǎn)品" 取出這段描述中的英文AD,AC,AF,WOC */
$str = "我司有電信AD、AC(已取消)、2018央采AF、WOC等車產(chǎn)品";
$pattern = "/[a-zA-Z]+/";
// $pattern = "/[a-zA-Z]*/";
$arr = preg_match_all ($pattern ,$str ,$match );
print_r ($match [0]); // 這里有一點(diǎn)要注意,正則表達(dá)式要用 + ,千萬不要用 * 。因?yàn)?匹配0,1,多次,導(dǎo)致返回結(jié)果會有很多空值。使用+就是至少有一個(gè)英文才會匹配。 View Code ?
一串?dāng)?shù)字,1,3,6,10,15,21,28,36,45······請用遞歸計(jì)算第三十個(gè)數(shù)字是多少 // addend=>加數(shù),counter=>計(jì)數(shù)器
function number ($num =1,$addend =2) { static $counter = 1;// counter記錄當(dāng)前$num是第幾個(gè)數(shù)字 $num += $addend ; $addend ++;// 加數(shù)遞增 $counter ++;// 每計(jì)算一次,計(jì)數(shù)器加1 當(dāng)counter == 30的時(shí)候結(jié)束 if ($counter < 30){ $num = number ($num ,$addend );// 要用一個(gè)變量來接收函數(shù)返回值才行,而且這里必須用num接收。//因?yàn)樽詈笠淮斡?jì)算,不會執(zhí)行if分支,直接返回計(jì)算結(jié)果num,num返回到函數(shù)調(diào)用處。如果不用變量接收函數(shù)返回值,那么num最終返回的就是第一次計(jì)算的結(jié)果。為什么選擇用num接收,因?yàn)橐米詈笠淮魏瘮?shù)返回值覆蓋之前每一次計(jì)算的num值,這樣得到的結(jié)果才是正確的。不然的話返回的將是第一次計(jì)算的結(jié)果num=3。
} return $num ;
} echo number (); View Code ?想要得到第幾個(gè)數(shù)字都可以,直接調(diào)用的時(shí)候傳一個(gè)參數(shù)即可。如下:
// addend=>加數(shù),counter=>計(jì)數(shù)器
function number ($k ,$num =1,$addend =2) { static $counter = 1;// counter記錄當(dāng)前$num是第幾個(gè)數(shù)字 $num += $addend ; $addend ++;// 加數(shù)遞增 $counter ++;// 每計(jì)算一次,計(jì)數(shù)器加1 當(dāng)counter == 30的時(shí)候結(jié)束 if ($counter < $k ){ $num = number ($k ,$num ,$addend );// 要用一個(gè)變量來接收函數(shù)返回值才行,而且這里必須用num接收。//因?yàn)樽詈笠淮斡?jì)算,不會執(zhí)行if分支,直接返回計(jì)算結(jié)果num,num返回到函數(shù)調(diào)用處。如果不用變量接收函數(shù)返回值,那么num最終返回的就是第一次計(jì)算的結(jié)果。為什么選擇用num接收,因?yàn)橐米詈笠淮魏瘮?shù)返回值覆蓋之前每一次計(jì)算的num值,這樣得到的結(jié)果才是正確的。不然的話返回的將是第一次計(jì)算的結(jié)果num=3。
} return $num ;
} echo number (30); View Code ?
sql 類型題(wamp下student數(shù)據(jù)庫): select a.grade,b.name,a.name,c.score,max (score) as maxscore from a,b,c where a.id= c.stu_id and b.id= c.subject_id group by a.grade,b.name ; 第一題答案,但是名字還沒有對應(yīng),查詢出來的名字不是最高分對應(yīng)的學(xué)生名。用到了三表聯(lián)查 。。還有就是group by后面可以接多個(gè)字段 ,第一次使用。而且group by 后面字段之間使用逗號 和使用and是不一樣的。使用逗號是(怎么說呢,就拿本題來說吧)按年級和科目分組,一年級,二年級·····然后一年級里還有語文、數(shù)學(xué)········結(jié)果如下圖
?第二題:要按照stu_id分組,不能按照學(xué)生姓名分組,因?yàn)閷W(xué)生姓名會有重復(fù)的,要統(tǒng)計(jì)所有學(xué)生的分?jǐn)?shù),并且不可以去重。
select a.grade,a.class,a.name,max (score) as maxscore,min (score) as minscore,avg (score) as avgscore from a,c where a.id= c.stu_id group by c.stu_id; 第三題:按年級分組,每個(gè)年級中排名第一的班級(所有學(xué)生的所有科目平均分排名第一)
select a.grade,a.class,avg (score) from a,c where a.id= c.stu_id group by a.grade,a.class; 先計(jì)算出每個(gè)年級中的每個(gè)班級平均分(如上SQL),在從結(jié)果中篩選出平均分最大的那個(gè)班級。
select grade,class,max (avgscore) as maxscore2 from (select a.grade,a.class,avg (score) as avgscore from a,c where a.id= c.stu_id group by a.grade,a.class) as s group by grade ; 這里用到了嵌套查詢 (效率低,不得已而用,沒想到其他方法),還有注意一點(diǎn),就是from后面的子句要起別名 ,否則會報(bào)錯(cuò):Every derived table must have its own alias 。意思是:每個(gè)派生表都必須有自己的別名。這里起了一個(gè)別名s。
轉(zhuǎn)載于:https://www.cnblogs.com/bneglect/p/10986845.html
總結(jié)
以上是生活随笔 為你收集整理的面试题(程序02) 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。