admin管理员组

文章数量:1794759

php的cli模式编程

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)); } ?>

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

本文标签: 模式PHPcli