总代码放在LeetCode的PlayGround 上的。链接 https://leetcode-cn.com/playground/KLDrK2KK
首先这次笔试题目总体来说还算不错。题目分两部分,选择题和编程题。
选择题80个,60分钟,考察了SQL语句、数据库知识、编程语言C++,JAVA、测试相关、数学运算与推理几大部分,题目相对基础,但时间紧,不会就直接蒙了下一个,到点刚刚完成。
编程题3个,90分钟,主要考察字符串和数组,最后一题当时没跑出来,差点时间修改,但主体代码已完成并提交了,不知道能够得分不,下面来看看这三个编程题目。题目是个大概,记得不是特别清楚。
一个由字母数字组合的字符串,先是一个字母随后紧跟一个数字,数字代表该字母出现的次数,输出最终的字符串。
输入:A3B5C2
输出:AAABBBBBCC
代码
public static String fun(String s){
StringBuilder sb = new StringBuilder();
for(int i = 0;i<s.length();i+=2){
int idx = s.charAt(i+1) - '0';
for(int j = 0;j < idx;j++)
sb.append(s.charAt(i));
}
return sb.toString();
}
时间复杂度:O(N^2)
空间复杂度:O(1)
对一个字符串加密,加密条件是当索引为偶数时,当前字符向前移动,奇数向后移动,当需加密字符串长度大于数组2时,又从数组2开始位置算起。
示例
输入 text = “hello” encryp = “23151”
输出 “jbmgp”
代码
public static String encryption(String text,String encryp){
StringBuilder sb = new StringBuilder();
for(int i = 0;i < text.length();i++){
int c = text.charAt(i) - 'a';
int cur = encryp.charAt(i%encryp.length()) - '0'; //此处取模,加密字符串长度
if(i%2 == 0){
sb.append((char) ('a' + (c+cur)%26)); // + 强制类型转换为char,同样需要取模运算
}
else
sb.append((char) ('a' + (c-cur)%26));// - 强制类型转换为char,同样需要取模运算
}
return sb.toString();
}
时间复杂度: O(N)
空间复杂度: O(1)
给定两个数组,一个name = [“张三”,“李四”,“王五”]表示学生姓名,一个score = [“99,89,79,69”,“81,80,79,85”,“90,80,90,99”]分别表示三个人的各科成绩,要求输出三个人总成绩降序排列的姓名,即输出 res = [“张三”,“王五”,“李四”].
也就是先求出每个人的总成绩然后降序排列,输出对应人的姓名。
给定的例子:
输入:["张三","李四","王五"],
["99,89,79,69","81,80,79,85","90,80,90,99"]
输出:["张三","王五","李四"]
给定的函数:
class Solution{
public String[] sort(String[] name,String[] score){
}
}
算法思路 :可以看出本题其实就是要将每个人的字符串成绩相加,这里涉及字符串的拆分,转换为数字相加,然后排序,输出对应的人名。
代码
// "static void main" must be defined in a public class.
public class Main {
public static void main(String[] args) {
String[] name = {"张三","李四","王五"};
String[] score = {"99,89,79","81,80,79","90,80,90"};
String[] res = new String[name.length];
res = sort(name,score);
for(int i = 0;i < name.length;i++)
System.out.println(res[i]);
}
public static String[] sort(String[] name,String[] score){
String[] res = new String[name.length];
int[] sum = new int[name.length];
for(int i = 0;i < score.length;i++){
sum[i] = addsum(score[i]);
}
Map<Integer,String> map = new HashMap<>();
for(int i = 0;i < name.length;i++)
map.put(sum[i],name[i]); //将总成绩和姓名一一对应
Arrays.sort(sum);//sum排序,这里是升序
for(int i = 0;i < name.length;i++)
res[i] = map.get(sum[sum.length-1 - i]); //由于sum是升序的,所以从最后一个数开始将结果加入res
return res;
}
public static int addsum(String s){
int sum = 0;
//可以用split()方法,即String[] score = s.split(',');
String[] score = s.split(",");
for(int i = 0;i < score.length;i++){
//下面两种方法都可以将字符串转换为整型
//sum += Integer.parseInt(score[i]);
sum += Integer.valueOf(score[i]).intValue();
}
return sum;
}
}
复杂度
时间复杂度:O(N*N)
空间复杂度:O(N)