反正我觉得有意思的题,有空就整理整理放进来吧,长期更。
1. 有50个人(编号1-50)围成一个圈,从第一个开始数,数道7,踢出这个人,然后接着往下循环数。直到剩下最后一个为止,请问这个的编号是几?
这是个约瑟夫环,更多请看: 约瑟夫环-百度百科
/**
* (约瑟夫环)
* @param int $n 总人数,从1开始编号
* @param int $m 数道几踢人
* @return int 幸运儿编号
*/
function shu($n,$m){
$arr=range(1,$n);//创建数组
$i=0;
while(count($arr)>1){
$i+=1;//开始查数
$head=array_shift($arr);//将数组开头的单元移出数组 返回被移除的元素,数组为引用关系
if($i%$m!=0){
array_push($arr,$head);//将一个或多个单元压入数组的末尾(入栈)
}
}
return $arr[0];
}
echo "幸运儿编号:".shu(50,7);
简单分析下:
$arr为根据传入的总人数$n,创建的1到$n的整数数组,即给每个人编号。
while条件是当$arr等于1时则跳出循环,结束函数,返回幸运儿编号。
循环中,$i其实就是数道几,先使用array_shift函数得到$arr的第一个元素。
如果$i刚好是$m倍数,那么就踢掉这个数,否则就把这个元素,重新放入$arr的末尾,即循环数之意。
2. 使用python一行代码打印乘法口诀表。
print ('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))
python的列表生成式语法。
显示最后部分从 range(1,10),就是1~9的列表集合中循环取值赋值给x。
接着的range(1,x+1) 就灵活的使用了上面的x
然后就是使用%格式化字符串了,&-2s表示占2位。
最后使用 join 函数将集合链接成字符串,配置空格字符串和换行符形成乘法口诀表的格式。
3. mysql,写出查询A表中a1字段 Like B表中b1字段,并且 A.a2 = B.b2 的所有记录的SQL。
SELECT * FROM A,B WHERE A.a2=B.b2 AND A.a1 LIKE CONCAT("%",B.b1,"%");
CONCAT()函数用于将多个字符串连接成一个字符串
4. 从文章标签关联表中取出关联文章篇数小于2的标签,并得到总数量做分页。
文章标签关联表 taglist
tid 为标签id, aid 为 文章id
取出关联文章篇数小于2的标签
SELECT tid,aid,COUNT(*) as aids FROM taglist GROUP BY tid HAVING aids < 2 ORDER BY tid ASC;
这边就是用tid进行分组,然后关于COUNT(*)就是同个标签id关联的文章篇数了.别名 aids ,在 HAVING 中是可以作为条件的。
取得分组筛选后的总记录数
SELECT COUNT(*) FROM(SELECT COUNT(*) as aids FROM taglist GROUP BY tid HAVING aids < 2) as a;
SELECT COUNT(*) FROM(子查询) [AS] 子查询的别名
5. 看图,写出符合要求的SQL
答案:
SELECT score,((SELECT count(DISTINCT(score)) FROM score WHERE score > s.score)+1) AS RANK FROM score AS s ORDER BY s.score DESC;
记录点想法,可能弄成题目
1. left join 多表集合
select * FROM dc_device AS a LEFT JOIN
(
select * from dc_device_manholecover
union
select * from dc_device_dustbin
union
SELECT * from dc_device_smoke
) as tmp ON a.id = tmp.device_id ORDER BY a.id ASC ;
6. 批量杀死进程的命令,比如所有和ffmpeg相关的
ps -ef|grep ffmpeg|awk '{print $2}'|xargs kill -9