2019/10/9,晚上19:00-20:40。
我参加了科大讯飞的的笔试,体型有三种,单选,多选和两道编程题。
科大讯飞的笔试和我之前参加的浪潮、网易的笔试不同,它的编程题所占的比重较低,只有百分之四十。而且编程题的难度也不大,在力扣中估计都分被分类到简单题型当中。所以我认为科大讯飞编程题可能更多的考察代码的完整性。

第一道编程题

题目要求: 编写注册验证功能
1.原系统中包括两个注册好的账号“zhangsan"和"lisi",要求新注册的账号用户名不能已经存在,否则输出”用户名已经存在“,中止程序。
2.密码必须是8到16位,且必须由数字和字母组成,否则输出”密码格式不正确“,中止程序。
3.手机号码必须是11位,且开头必须是1,否则输出”请输入正确的手机号“,中止程序
4.如果全部输入正确,输出”注册成功“

我一开始想解题思路的时候逻辑有点混乱,第一点想到的是抽象出三个方法,一一判断用户名、密码和手机号是否输入正确。但是问题来了?如何在用户名输入错误的时候中止程序,用户名输入正确的时候继续程序呢?
思索之后决定利用flag标志,代码如下:

package kedaxunfei1;
import java.util.Scanner;
//科大讯飞第一道编程题
public class Main {;
	
	public static void main(String[] args) {
		//输入
		Scanner sc=new Scanner(System.in);
		int flag=0;
		while(flag==0) {
			String name=sc.next();
			flag=user(name,flag);
			if(flag==1) {
				break;
			}
			String passerword=sc.next();
			flag=passerword(passerword,flag);
			if(flag==1) {
				break;
			}
			String phone=sc.next();
			flag=phone(phone,flag);
			if(flag==1) {
				break;
			}
			System.out.println("注册成功");
			break;
		}
		
	}
	private static int phone(String phone, int flag) {
		if(phone.charAt(0)!=1||phone.length()!=11) {
			System.out.println("请输入正确的手机号码");
			flag=1;
		}
		return flag;
	}
	private static int passerword(String passerword, int flag) {
		if(passerword.length()<8||passerword.length()>16) {
			System.out.println("密码格式错误");
			flag=1;
		}
		return flag;
	}
	private static int user(String name,int flag) {
		if(name.equals("zhangsan")||name.equals("lisi")) {
			System.out.println("该用户名已存在");
			flag=1;
		}
		return flag;
	}
}

代码通过了62.5%的测试用例 ,没有全部通过我一点都不意外,因为逻辑混乱的时间太久所有写出来的代码不仅不完整,还很难看。
首先,while循环怎么看怎么觉得冗长,
其次passerword()方法未实现输入只能是数字和密码的要求,phone()方法手机号码没能保证输入的只能是数字,假如输入了字母呢?

第二道编程题

题目要求: 将输入的数字n(n>=0)分解,然后让分解的数字相乘,求相乘后的最大值。
例如:
输入: 5
输出: 6

代码如下:

package kedaxunfei2;
import java.util.Scanner;
//科大讯飞第二道编程题
public class Main {;
	
	public static void main(String[] args) {
		//输入
		Scanner sc=new Scanner(System.in);
		long n=sc.nextLong();
			
		//处理
		if(n==0) {
			System.out.println(0);
		}else if(n%2==0) {
			long m=(n/2)*(n/2);
			System.out.println(m);
		}else {
			long m=(n/2)*(n/2+1);
			System.out.println(m);
		}
	}
}

代码通过了75%的测试用例 ,刚看到这道题我就懵了,这TM怎么分解!看了看给出的测试用例,5=2+3,2*3=6;假设只分解成两个整数,那么要分成两种情况考虑——n为奇数和n为偶数。但是,你咋能保证只能分解成两个整数,而不会是3个,4个…
别的也不会啊,不管了!先写上去跑跑再说。没想到,第一次就跑出了75%,虽然我跑之前就没抱多大希望。
那为什么不是100%呢?问题出在哪?
是n的类型限制吗?我把n从int类型改为long,然并卵。

总结

  • 大公司的编程题从我目前写过的三家来看,难度都是不大的,只要不放弃总是能通过一些测试用例的,然而你的问题在于很少把问题解答的完整的。如果不能把编程题的通过率提高到75%,我觉得是很难接到面试通知的。
  • 上次写的网易的笔试题,我非常满意的一点是遇到没想明白的题,及时向后看,最后回头重新写反而把原来没想明白的题解出了一部分。而科大讯飞这一次的笔试题则相反。如果我没时间写第二题之后可能会很遗憾的发现,第二题不写是很亏的。