小米的校招笔试,2小时三道编程题。
Q1:给出一个int数组,通过变换使得左边全为奇数右边全为偶数。
思路:常见题,递归实现。双指针从头尾分边对数组进行扫描,对于“左偶右奇”的情况,交换两数同时指针向中间移动一位。循环上述过程直到指针重合。
Q2:给出一颗有序二叉树,将它转换为有序的双向链表输出。
有序二叉树形如:
10
/ \
6 14
/ \ / \
4 8 12 16
双向链表形如:
4=6=8=10=12=14=16
思路:参考二叉树中序遍历。
Q3:字符串的四则运算。给出一个字符串,包含0~9的数字和+-*/()的运算符,-仅代表减号不代表负数。举例如下:
输入:1+2*(3-4)
输出:-1.
思路:(1) 分析字符串的合法性 (2) 模拟四则运算规则,按照先括号后乘除最后加减的顺序计算,(逆波兰式)
测试用例:
a.空串
b.一般输入, 1+2*(3-4)
c.多层括号嵌套, 1+2*((3-4)+8)
d.非法字符输入,9+A+8
e.非法计算符号,*-20+5
f.括号不匹配,1+2*(3-4)(
g.括号内为空,1+2*()*9
h.除零情况,1+2*6/(3-3)