php的cli模式编程

cli模式编程

前两天稍微有点闲,就去牛客网刷了几道算法题,之前算法一直都是c语言写的,然而这段时间都在学习php,c语言感觉有点力不从心,于是我就想到用php来编程。不编不知道,一编吓一跳,学了这么久的php,我竟然不知道php的标准输入方式,之前都是web端表单传至或者是ajax传值得到数据,并没有直接用php输入数据。闲话就不多说了,下面走入正题

php环境配置

之前一直是集成wamp环境下写网页,也没必要配置环境
将php.exe所在的目录E:\wampserver\bin\php\php5.5.12存进环境变量path中

php标准输入输出

//标准输入
$s = trim(fgets(STDIN));	
//标准输出
fwrite(STDOUT, "请输入一个3-50位长度的字符串: ");   

标准输入输出的获取很简单,网上一搜一大堆,找到标准输入输出,我就信心满满的来开始我的编程之旅。

1.[编程题] 黑白卡片
​ 时间限制:1秒
​ 空间限制:32768K
牛牛有n张卡片排成一个序列.每张卡片一面是黑色的,另一面是白色的。初始状态的时候有些卡片是黑色朝上,有些卡片是白色朝上。牛牛现在想要把一些卡片翻过来,得到一种交替排列的形式,即每对相邻卡片的颜色都是不一样的。牛牛想知道最少需要翻转多少张卡片可以变成交替排列的形式。

输入描述:
输入包括一个字符串S,字符串长度length(3 ≤ length ≤ 50),其中只包含’W’和’B’两种字符串,分别表示白色和黑色。整个字符串表示卡片序列的初始状态。

输出描述:
输出一个整数,表示牛牛最多需要翻转的次数。

输入例子:
BBBW

输出例子:
1

题目分析:由题意得,要得到交替排列形式,只有BWBWBW…或者WBWBWB…这两种可能,得到这两种形式串所需步数,然后取出最小值。或可算出一种即可,若大于总数的一半则用总数减去,因为得到两种形式串的步数和为序列总数。可以通过比较前后两个数,若相同,则变,变量值加1;不同则不变,变量值不变,最后获得的序列由第一个值决定,若是大于总数的一半则总数减去算出的步数。

题目的思路已经出来了,接下来就是实战了,写了输入后

字符串逐个读取

$len = strlen($s);
$arr = str_split($s);

通过str_split函数将字符串存进arr数组中,然后使用for循环将字符一个一个读取然后比较
总的来说这个题想对来说,难点已经解决。下面是程序代码

<?php
	header("charset=utf-8"); 
	// fwrite(STDOUT, "请输入一个3-50位长度的字符串: ");   
	$s = trim(fgets(STDIN));	
	$len = strlen($s);
	if("^[WB]{3-50}+$"){
        $arr = str_split($s); 
        $j = 0;
        for($i=0; $i<$len-1; $i++){
            if($arr[$i]=='W'){
                if($arr[$i+1]==$arr[$i]){
                    $j++;
                    $arr[$i+1]='B';
                }
            }else{
                if($arr[$i+1]==$arr[$i]){
                    $j++;
                    $arr[$i+1]='W';
                }
            }
        }
        if($j*2>$len){
            $j=$len-$j;
        }
        echo $j;
        return $j;
    }else{
        // fwrite(STDOUT, "请输入一个3-50位长度的字符串: ");  
		$s = trim(fgets(STDIN));
    }
?>

这两行注释是由于牛客网答题系统不支持,还有更多的编程题会在后边续写。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值