經(jīng)典面試題一、判斷括號(hào)是否閉合的代碼實(shí)現(xiàn)
1. 題目?jī)?nèi)容:
? ? 給定一長(zhǎng)串字母和符號(hào),里面有三種括號(hào)包括([{}])這些,需要判斷這三種括號(hào)必須是配對(duì)的。即這三類括號(hào)要么不出現(xiàn),要出現(xiàn)必須是先出現(xiàn)左邊的括號(hào),然后出現(xiàn)右邊的,中間括號(hào)可以嵌套。
2. 解答思路:
? ? 定義一個(gè)字符對(duì)應(yīng)關(guān)系數(shù)組,初始化一個(gè)數(shù)組棧。所以進(jìn)入的左邊符號(hào)入棧,如果進(jìn)入的是右邊的符號(hào),則與棧中最后進(jìn)入的元素進(jìn)行配對(duì)判斷,如果配對(duì)則消除這對(duì)符號(hào)。如果不配對(duì),則說(shuō)明不配對(duì)。
3. PHP編程實(shí)現(xiàn):
#([{)]}類括號(hào)符號(hào)是否閉合的判斷
#04.cn
$args = getopt('c:');
extract($args);
echo "\n接收字符串:".$c."\n閉合判斷結(jié)果:";
function checkClose($str){
#定義一個(gè)關(guān)系
$relate = array('('=>')', '['=>']', '{'=>'}' );
#遍歷字符串將對(duì)應(yīng)符號(hào)插入棧
$quene = array();
for($i=0; $i< strlen($str); $i++){
#如果是出現(xiàn)了([{類字符,則直接存入棧等待配對(duì)
if(isset($relate[$str{$i}])){
array_push($quene, $str{$i});
}elseif( in_array($str{$i}, $relate)){
#如果出現(xiàn)了右邊的)]}類字符,則必須與棧中最后一個(gè)元素相匹配,否則即為不是閉合的
if($str{$i} != $relate[end($quene)]){
return false;
}else{
#匹配的話則消除這對(duì)符號(hào)
array_pop($quene);
}
}else{
#非上述6個(gè)符號(hào)的內(nèi)容不用考慮
continue;
}
}
#結(jié)尾只需要返回對(duì)$quene的判斷
return (bool)!$quene;
}
var_dump(checkClose($c));
4. 運(yùn)行結(jié)果:
在服務(wù)器命令行模式中運(yùn)行結(jié)果如下:
[root@047 php]# php close.php -c='req(9[09]pp{rew}' 接收字符串:req(9[09]pp{rew} 閉合判斷結(jié)果:bool(false) [root@047 php]# php close.php -c='req(9[09]pp{rew})' 接收字符串:req(9[09]pp{rew}) 閉合判斷結(jié)果:bool(true)
經(jīng)典面試題二、一個(gè)玩家進(jìn)游戲場(chǎng)地分配號(hào)碼的php代碼實(shí)現(xiàn)
1. 題目?jī)?nèi)容:
? ? 一個(gè)簡(jiǎn)單的容易在面試中碰到的動(dòng)手編碼題,一個(gè)游戲場(chǎng)地最多只能容納200個(gè)玩家,每個(gè)玩家都有一個(gè)號(hào)碼,號(hào)碼的范圍從0~199,全程不斷地有玩家進(jìn)進(jìn)出出,但是每個(gè)在場(chǎng)玩家的號(hào)碼各不相同。 請(qǐng)?jiān)O(shè)計(jì)一個(gè)類TicketsPool,負(fù)責(zé)給進(jìn)去的玩家分配號(hào)碼(給出玩家申請(qǐng)?zhí)柎a的實(shí)現(xiàn),并給出你覺(jué)得應(yīng)該有的成員方法,代碼可以適當(dāng)加注釋)以及用戶退出的方法實(shí)現(xiàn)。
2. 解答思路:
????實(shí)現(xiàn)起來(lái)也簡(jiǎn)單,可以設(shè)想有一套玩家用戶系統(tǒng),經(jīng)過(guò)玩家基本賬號(hào)驗(yàn)證之后進(jìn)入玩家游戲場(chǎng)地,我這里就用的玩家的名稱作為進(jìn)入的唯一標(biāo)記吧,當(dāng)然可以使用用戶uid,只要保障每次進(jìn)來(lái)的時(shí)候能正確分配號(hào)碼,不會(huì)沖突,如果出現(xiàn)房間滿員能返回滿員的信息。
3. PHP編程實(shí)現(xiàn):
<?php
#玩家入場(chǎng)退出類
class TicketsPool{
static $numArr = array();
#成員初始化進(jìn)入
public function getNum($username){
//同一用戶重入
$key = array_search($username, self::$numArr);
if($key!==false){
return $key;
}
#查找空號(hào)碼
#for($i=0; $i<200; $i++){
for($i=0; $i<5; $i++){
if(!isset(self::$numArr[$i])){
self::$numArr[$i] = $username;
return $i;
}
}
#滿員
return false;
}
#成員退出
public function logout($username){
$key = array_search($username, self::$numArr);
if($key!==false){
unset(self::$numArr[$key]);
return true;
}else{
#非法調(diào)用
return false;
}
}
}
$TicketsPool = new TicketsPool();
$gamerArr = array( 'tomorrow', '哈哈', '國(guó)慶了', '大飛機(jī)', '殲20', '快遞來(lái)了', '再來(lái)一個(gè)');
foreach($gamerArr as $username){
$room_id = $TicketsPool->getNum($username);
if($room_id !== false){
echo $username."-分配號(hào)碼:".$room_id,"\n";
}else{
echo $username."--分配失敗:房間滿員了\n";
echo "國(guó)慶了 退出房間:退出".($TicketsPool->logout('國(guó)慶了')?'成功':'失敗')."\n";
}
}
4. 運(yùn)行結(jié)果:
在linux上執(zhí)行結(jié)果如下:
[root@007 php]# php game.php?
tomorrow-分配號(hào)碼:0
哈哈-分配號(hào)碼:1
國(guó)慶了-分配號(hào)碼:2
大飛機(jī)-分配號(hào)碼:3
殲20-分配號(hào)碼:4
快遞來(lái)了--分配失敗:房間滿員了
國(guó)慶了 退出房間:退出成功
再來(lái)一個(gè)-分配號(hào)碼:2
經(jīng)典面試題三、php從給定字符串中提取出所有回文串字符的代碼實(shí)現(xiàn)
1. 題目?jī)?nèi)容:
????php從字符串中提出回文串?dāng)?shù)據(jù),什么是回文串?回文串是一個(gè)正讀和反讀都一樣的字符串,比如abcba或者abba等等就是回文串。今天看到了一道回文串相關(guān)的題目:給定一個(gè)字符串s,你可以從中刪除一些字符,使得剩下的串是一個(gè)回文串。如何刪除才能使得回文串最長(zhǎng)呢?輸出需要?jiǎng)h除的字符個(gè)數(shù)。
????這是網(wǎng)上有人記錄的遇到的面試題,我到還沒(méi)有碰到過(guò),于是就當(dāng)自己去面試吧,拿到題后就自己開(kāi)始考慮接著就開(kāi)始干了,事情都是越想越清楚,在慢慢地嘗試和試錯(cuò)中解決,晚上也在未借助任何外力進(jìn)行實(shí)現(xiàn)了,不知道網(wǎng)上有沒(méi)有同樣的實(shí)現(xiàn)方法。雖然我自己能單獨(dú)完成,但我不得不承認(rèn),如果是在一個(gè)面試環(huán)境,同時(shí)時(shí)間又有限的情況下,我也無(wú)法保證自己能做出來(lái)。更不要說(shuō)考慮性能了。
2. 解答思路:
????思路也很簡(jiǎn)單,回文串肯定至少有2個(gè)字符,可以是奇數(shù)個(gè)也可以是偶數(shù)個(gè),所以拿到一個(gè)字符串,直接從第2個(gè)字符開(kāi)始我將字符切成左右兩邊,然后同時(shí)從中間出發(fā)去兩邊尋找同樣的字符以達(dá)到回文,如果找到了就表示這個(gè)字符可以在回文串中,并進(jìn)行記錄。同時(shí)把兩段字符分別從中間刪除掉查找過(guò)的字符或者部分字符(因?yàn)檫@部分不會(huì)再有可能出現(xiàn)在回文串中),一直到左邊或者右邊的字符串為空,最終查出了整個(gè)字符串中所有可能的回文串,再?gòu)倪@些回文串?dāng)?shù)據(jù)列表里查找最長(zhǎng)的回文串就不是問(wèn)題了。
3. PHP編程實(shí)現(xiàn):
具體完整實(shí)現(xiàn)的php代碼如下:
<?php
#入?yún)z查
$args = getopt('c:');
extract($args);
if(empty($c)) exit('need param:c');
echo "入?yún):{$c}\n";
#調(diào)用實(shí)例
$BackChar = new BackChar();
print_r($BackChar->getBackChar($c));
#回文串實(shí)現(xiàn)類
class BackChar{
#定義一個(gè)數(shù)組存儲(chǔ)字符
private $char;
public $backArr = array();
#每個(gè)位置開(kāi)始嘗試尋找回文串
protected function calcute($i, $odd=true){
#從中間開(kāi)始向兩邊嘗試找回串,將查找寄數(shù)個(gè)和偶數(shù)個(gè)字符的方式合并
$left = substr($this->char, 0, $i);
$right = substr($this->char, $odd?($i+1):$i);
$c = $odd?$this->char{$i}:'';
$ok = '';
$index_l = strlen($left);
while($left && $right){
$val = substr($left, $index_l - 1, 1);
$left= substr($left,0,-1);
#如果找到了,則說(shuō)明可以關(guān)閉一組字符
$index_r = strpos($right, $val);
if($index_r !== false){
$ok.=$val;
$right = substr($right, $index_r +1);
}
$index_l --;
}
#只有在找到了匹對(duì)的字符才認(rèn)為是有回串
if($ok){
$key = strrev($ok).$c.$ok;
$this->backArr[$key] = strlen($key);
}
}
#供外部調(diào)用的方法
public function getBackChar($char){
$this->char = $char;
#循環(huán)嘗試回文串的位置
for($i=1; $i<strlen($char)-1; $i++){
#嘗試找出所有奇數(shù)個(gè)回文串字符
$this->calcute($i);
#嘗試找出偶數(shù)個(gè)回文串字符
$this->calcute($i, false);
}
#返回所有的回文串字符串
return $this->backArr;
}
}
4. 運(yùn)行結(jié)果:
在linux服務(wù)器上執(zhí)行結(jié)果如下:
[root@007 php]# php back.php -c=helloworld
入?yún):helloworld
Array
(
[lll] => 3
[ll] => 2
[lol] => 3
[lowol] => 5
[lool] => 4
[lrl] => 3
)
[root@007 php]# php back.php -c=abcdehkkkabzhtt99ba
入?yún):abcdehkkkabzhtt99ba
Array
(
[aba] => 3
[aa] => 2
[abcba] => 5
[abba] => 4
[abdba] => 5
[abeba] => 5
[abhba] => 5
[abhkhba] => 7
[abhhba] => 6
[abhkkkhba] => 9
[abhkkhba] => 8
[abhahba] => 7
[abzba] => 5
[abtba] => 5
[abttba] => 6
[ab9ba] => 5
[ab99ba] => 6
)
????后在網(wǎng)上看到說(shuō)這個(gè)問(wèn)題可從兩個(gè)字符間的最大子串角度來(lái)思考,我到?jīng)]去想這塊,只是把目標(biāo)一步一步實(shí)現(xiàn)了吧,當(dāng)然這個(gè)方法肯定還有改進(jìn)的余地,等下回有時(shí)間有閑再看看吧。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-857346.html
?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-857346.html
到了這里,關(guān)于經(jīng)典面試題:玩家進(jìn)游戲場(chǎng)地分配號(hào)碼、判斷括號(hào)是否閉合、提取回文串字符的分析和 php 程序?qū)崿F(xiàn) - 經(jīng)典數(shù)據(jù)結(jié)構(gòu)面試的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!