经典面试题:玩家进游戏场地分配号码、判断括号是否闭合、提取回文串字符的分析和 php 程序实现 - 经典数据结构面试

这篇具有很好参考价值的文章主要介绍了经典面试题:玩家进游戏场地分配号码、判断括号是否闭合、提取回文串字符的分析和 php 程序实现 - 经典数据结构面试。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

经典面试题一、判断括号是否闭合的代码实现

1. 题目内容:

    给定一长串字母和符号,里面有三种括号包括([{}])这些,需要判断这三种括号必须是配对的。即这三类括号要么不出现,要出现必须是先出现左边的括号,然后出现右边的,中间括号可以嵌套。

2. 解答思路:

    定义一个字符对应关系数组,初始化一个数组栈。所以进入的左边符号入栈,如果进入的是右边的符号,则与栈中最后进入的元素进行配对判断,如果配对则消除这对符号。如果不配对,则说明不配对。

3. PHP编程实现:

#([{)]}类括号符号是否闭合的判断
#04.cn
$args = getopt('c:');
extract($args);
echo "\n接收字符串:".$c."\n闭合判断结果:";

function checkClose($str){
    #定义一个关系
    $relate = array('('=>')', '['=>']', '{'=>'}' );  

    #遍历字符串将对应符号插入栈
    $quene = array();
    for($i=0; $i< strlen($str); $i++){
        #如果是出现了([{类字符,则直接存入栈等待配对
        if(isset($relate[$str{$i}])){
            array_push($quene, $str{$i}); 
        }elseif( in_array($str{$i}, $relate)){
            #如果出现了右边的)]}类字符,则必须与栈中最后一个元素相匹配,否则即为不是闭合的
            if($str{$i} != $relate[end($quene)]){
                return false;
            }else{
                #匹配的话则消除这对符号
                array_pop($quene);
            }   
        }else{
            #非上述6个符号的内容不用考虑
            continue;
        }   
    }   

    #结尾只需要返回对$quene的判断
    return (bool)!$quene;
}
var_dump(checkClose($c));

4. 运行结果:

在服务器命令行模式中运行结果如下:

[root@047 php]# php close.php -c='req(9[09]pp{rew}'
接收字符串:req(9[09]pp{rew}
闭合判断结果:bool(false)

[root@047 php]# php close.php -c='req(9[09]pp{rew})'
接收字符串:req(9[09]pp{rew})
闭合判断结果:bool(true)

经典面试题二、一个玩家进游戏场地分配号码的php代码实现

1. 题目内容:

    一个简单的容易在面试中碰到的动手编码题,一个游戏场地最多只能容纳200个玩家,每个玩家都有一个号码,号码的范围从0~199,全程不断地有玩家进进出出,但是每个在场玩家的号码各不相同。 请设计一个类TicketsPool,负责给进去的玩家分配号码(给出玩家申请号码的实现,并给出你觉得应该有的成员方法,代码可以适当加注释)以及用户退出的方法实现。

2. 解答思路:

    实现起来也简单,可以设想有一套玩家用户系统,经过玩家基本账号验证之后进入玩家游戏场地,我这里就用的玩家的名称作为进入的唯一标记吧,当然可以使用用户uid,只要保障每次进来的时候能正确分配号码,不会冲突,如果出现房间满员能返回满员的信息。

3. PHP编程实现:

<?php
#玩家入场退出类
class TicketsPool{
    
    static $numArr = array();

    #成员初始化进入
    public function getNum($username){
            
        //同一用户重入
        $key = array_search($username, self::$numArr);
        if($key!==false){
            return $key;
        }   
            
        #查找空号码
        #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{
            #非法调用
            return false;
        }   
            
    }   
        
}

$TicketsPool = new TicketsPool();
$gamerArr = array( 'tomorrow', '哈哈', '国庆了', '大飞机', '歼20', '快递来了', '再来一个');
foreach($gamerArr as $username){
    $room_id = $TicketsPool->getNum($username);
    if($room_id !== false){
        echo $username."-分配号码:".$room_id,"\n";
    }else{
        echo $username."--分配失败:房间满员了\n";    
        echo "国庆了 退出房间:退出".($TicketsPool->logout('国庆了')?'成功':'失败')."\n";
    }   
}

4. 运行结果:

在linux上执行结果如下:

[root@007 php]# php game.php 
tomorrow-分配号码:0
哈哈-分配号码:1
国庆了-分配号码:2
大飞机-分配号码:3
歼20-分配号码:4
快递来了--分配失败:房间满员了
国庆了 退出房间:退出成功
再来一个-分配号码:2

经典面试题三、php从给定字符串中提取出所有回文串字符的代码实现

1. 题目内容:

    php从字符串中提出回文串数据,什么是回文串?回文串是一个正读和反读都一样的字符串,比如abcba或者abba等等就是回文串。今天看到了一道回文串相关的题目:给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?输出需要删除的字符个数。

    这是网上有人记录的遇到的面试题,我到还没有碰到过,于是就当自己去面试吧,拿到题后就自己开始考虑接着就开始干了,事情都是越想越清楚,在慢慢地尝试和试错中解决,晚上也在未借助任何外力进行实现了,不知道网上有没有同样的实现方法。虽然我自己能单独完成,但我不得不承认,如果是在一个面试环境,同时时间又有限的情况下,我也无法保证自己能做出来。更不要说考虑性能了。

2. 解答思路:

    思路也很简单,回文串肯定至少有2个字符,可以是奇数个也可以是偶数个,所以拿到一个字符串,直接从第2个字符开始我将字符切成左右两边,然后同时从中间出发去两边寻找同样的字符以达到回文,如果找到了就表示这个字符可以在回文串中,并进行记录。同时把两段字符分别从中间删除掉查找过的字符或者部分字符(因为这部分不会再有可能出现在回文串中),一直到左边或者右边的字符串为空,最终查出了整个字符串中所有可能的回文串,再从这些回文串数据列表里查找最长的回文串就不是问题了。

3. PHP编程实现:

具体完整实现的php代码如下:

<?php
#入参检查
$args = getopt('c:');
extract($args);
if(empty($c)) exit('need param:c');

echo "入参c:{$c}\n";
#调用实例
$BackChar = new BackChar();
print_r($BackChar->getBackChar($c));

#回文串实现类
class BackChar{

    #定义一个数组存储字符
    private $char;
    public $backArr = array();

    #每个位置开始尝试寻找回文串
    protected function calcute($i, $odd=true){

        #从中间开始向两边尝试找回串,将查找寄数个和偶数个字符的方式合并
        $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);

            #如果找到了,则说明可以关闭一组字符
            $index_r = strpos($right, $val);
            if($index_r !== false){
                $ok.=$val;
                $right = substr($right, $index_r +1);
            }   
    
            $index_l --; 
        }   

        #只有在找到了匹对的字符才认为是有回串
        if($ok){
            $key = strrev($ok).$c.$ok; 
            $this->backArr[$key] = strlen($key);
        }   
    }   
    
    #供外部调用的方法
    public function getBackChar($char){

        $this->char = $char;

        #循环尝试回文串的位置
        for($i=1; $i<strlen($char)-1; $i++){
            #尝试找出所有奇数个回文串字符
            $this->calcute($i);
            #尝试找出偶数个回文串字符
            $this->calcute($i, false);
        }

        #返回所有的回文串字符串
        return $this->backArr;
    }
}

4. 运行结果:

在linux服务器上执行结果如下:

[root@007 php]# php back.php -c=helloworld
入参c:helloworld
Array
(
    [lll] => 3
    [ll] => 2
    [lol] => 3
    [lowol] => 5
    [lool] => 4
    [lrl] => 3
)
[root@007 php]# php back.php -c=abcdehkkkabzhtt99ba
入参c: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
)

    后在网上看到说这个问题可从两个字符间的最大子串角度来思考,我到没去想这块,只是把目标一步一步实现了吧,当然这个方法肯定还有改进的余地,等下回有时间有闲再看看吧。

 文章来源地址https://www.toymoban.com/news/detail-857346.html

到了这里,关于经典面试题:玩家进游戏场地分配号码、判断括号是否闭合、提取回文串字符的分析和 php 程序实现 - 经典数据结构面试的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【pygame游戏开发】这几个经典游戏,小红书Python面试题目

    pygame.time.set_timer(change_hole_event, 800) mole = Mole(cfg.MOLE_IMAGEPATHS, hole_pos) hammer = Hammer(cfg.HAMMER_IMAGEPATHS, (500, 250)) clock = pygame.time.Clock() your_score = 0 flag = False init_time = pygame.time.get_ticks() while True: time_remain = round((61000 - (pygame.time.get_ticks() - init_time)) / 1000.) if time_remain == 40 and not flag: hole

    2024年04月25日
    浏览(31)
  • 【leetcode面试经典150题】10.跳跃游戏 II(C++)

    【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C++语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致) 给定一个长度为  n  的

    2024年04月08日
    浏览(33)
  • leetcode每日一题——45.跳跃游戏II(面试经典150题)

    45. 跳跃游戏 II - 力扣(LeetCode) 给定一个长度为 n 的 0 索引 整数数组 nums。 初始位置为 nums[0] 。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:   0 = j = nums[i]     i + j n 返回到达 nums[n - 1] 的最小跳跃次数

    2024年02月13日
    浏览(32)
  • 判断电话号码是否重复-excel

    有时候重复的数据不需要或者很烦人,就需要采取措施,希望以下的方法能帮到你。 方法一: 1)针对第一个单元格输入等号,以及公式countif(查找记录数的范围,需要查找的单元格) 2)输入enter之后,然后鼠标变为黑色的加号后,往下拉自动填充,如下图所示。 方法二:先

    2024年02月03日
    浏览(30)
  • 网站程序中手机号码判断方法

     需求:输入错误的手机号,会有提示语,正确的手机号码会有正确的图标   效果:   思路:   (1)排版(不细讲),使用input 、button、span等标签,排版里面一个主要的小点是,需要写出两个span ,通过v-show先进行隐藏,等后面判断手机号码的正确错误再进行显示与

    2024年02月08日
    浏览(34)
  • C语言经典算法之括号匹配算法

    目录 前言 A.建议 B.简介 一 代码实现 二 时空复杂度 A.时间复杂度分析 B.空间复杂度分析 三 优缺点 A.优点: B.缺点: 四 现实中的应用 1.学习算法最重要的是理解算法的每一步,而不是记住算法。 2.建议读者学习算法的时候,自己手动一步一步地运行算法。 tips:文中的(如

    2024年02月21日
    浏览(28)
  • java 根据身份证号码判断性别

    在Java中,您可以根据身份证号码的规则来判断性别。中国的身份证号码通常采用的是以下规则: 第17位数字代表性别,奇数表示男性,偶数表示女性。 通常,男性的出生日期的第15、16位数字是01,女性是02。 请注意,这只是一个大致的规则,实际上,有些特殊情况下的身份

    2024年02月07日
    浏览(35)
  • 【java】合法括号序列判断与Fibonacci数列

    目录 🔥编程题 1.合法括号序列判断 2.Fibonacci数列   1.合法括号序列判断 链接:合法括号序列判断__牛客网 (nowcoder.com) 给定一个字符串 A 和其长度 n ,请返回一个bool值代表它是否为一个合法的括号串(只能由括号组成)。 测试样例: \\\"(()())\\\",6 返回:true 测试样例: \\\"()a()()\\\",

    2023年04月23日
    浏览(21)
  • 根据身份证号码判断是否是未成年人

     /****      * 根据身份证号计算年龄      * @param str        * @param currDate       * @return      */     public boolean calcYear(String str, Date currDate){         DateFormat dateFormat = new SimpleDateFormat(\\\"yyyyMMdd\\\");         Long year = Long.parseLong(str.substring(0,4));         Long month = Long.parseLong(st

    2023年04月23日
    浏览(67)
  • 游戏玩家的新大陆?小红书游戏内容场景洞察

    2023年,如果你问年轻人他们在哪里讨论游戏?他们可能会提到一些平台,比如Steam、TapTap、B站、微博或者论坛。但是如果你向身边的女孩子询问,她们可能会惊喜地告诉你:小红书。 小红书平台一直给人的标签是是“美妆、旅游、美食分享”,但在现在的小红书生态里,“

    2024年02月09日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包