在接受采访时我被问到在两个陈述之间提取比较运算符的最快方法。
例如rate>=4
比较运算符为'&gt; ='它应该能够提取'>','<','!=','=','<=','>=','='
该函数必须返回比较运算符。
这是我写的,他们把它标记为错误。
function extractcomp($str)
{
$temp = [];
$matches = array('>','<','!','=');
foreach($matches as $match)
{
if(strpos($str,$match)!== false)
{
$temp[] = $match;
}
}
return implode('',$temp);
}
有没有人有更好的方法?
答案 0 :(得分:2)
你可以在第一次出现时逐字逐句地阅读,你可以确定它将成为下一个字符,即:
$ops = ['>','<','!','='];
$str = "rate!=4";
foreach($ops as $op)
{
if(($c1 = strpos($str, $op)) !== false)
{
$c2 = $str[$c1++] . (($str[$c1] == $ops[3]) ? $str[$c1] : "");
break;
}
}
echo $c2;
因此,如果第一个搜索字符是&#34;&gt;&#34;你只能假设第二个将是&#34; =&#34;或者它不存在。因此,您获得第一个字符的索引并递增它,并检查我们的搜索数组中是否存在第二个字符。然后返回值。这将循环,直到找到第一次出现然后中断。
编辑: 这是另一个解决方案:
$str = "rate!=4";
$arr = array_intersect(str_split($str), ['>','<','=','!']);
echo current($arr).(end($arr) ? end($arr) : '');
不如循环快,但肯定会减少膨胀代码。
总是有更好的方法来优化代码。
答案 1 :(得分:1)
除非他们在这个自定义函数中使用一些猴子字符串,否则我建议使用带有远程字符掩码的trim()。像echo trim('rate>=4',"A..Za..z0..9");
这样的东西可以在大约一半的时间内用于您的样本输入。
代码:(Demo)
function extractcomp($str){
return trim($str,"A..Za..z0..9");
}
echo extractcomp("rate>=4");
关于正则表达式,使用preg_match()
计算步数更高的效率是使用字符类来匹配运算符。
假设只使用有效的运算符,您可以使用/[><!=]+/
或者如果您想要加长长度/[><!=]{1,3}/
您的示例输入字符串只需8步。 Demo
这不如Andreas&#39;基于|
的模式,但步骤较少。
这取决于模式必须有多严格。我的模式将匹配!==
。
如果您想改进循环方法,请在匹配整个比较运算符后编写break
。
实际上,您正在循环运算符。这可能是他们的问题(或其中之一)。您的方法与==
不匹配。我不确定这是否是可能的比较(它不在您的列表中)。