华为云计算BU一面手撕
面得最久的一次,一共一个半小时,java基础,jvm,集合,spring,mybatis,数据库,Linux,计网都有涉及
下面是手撕题
一开始是这道题
/*
重构字符串
给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。
返回 s 的任意可能的重新排列。若不可行,返回空字符串 "" 。
示例 1:
输入: s = "aab"
输出: "aba"
示例 2:
输入: s = "aaab"
输出: ""
提示:
1 <= s.length <= 500
s 只包含小写字母
*/
感觉短时间内写不出来,然后问面试官能不能换题,面试官换了一题之后才写出来的
下面是换过的题
/*
公共字符
按ASCII码升序输出所有符合要求的字符; 如果没有符合要求的字符,则输出空列表[]。
样例1
输入:
2 ["aabbccFFFFx2x2", "aaccddFFFFx2x2", "aabcdFFFFx2x2"]
输出:
["2", "F", "a", "x"]
解释:
字符 a 在三个字符串中都出现 2次,符合要求;
字符 b 在第二三个字符串中分别出现 0次、1次,不符合要求;
字符 c 在第三个字符串中出现 1次,不符合要求;
字符 d 在第三个字符串中出现 1次,不符合要求;
字符 F 在三个字符串中都出现了 4 次,符合要求;
字符 x 在三个字符串中都出现了 2 次,符合要求;
字符 2 在三个字符串中都出现了 2 次,符合要求;
因此字符 a、F、x、2符合要求,按ASCII码升序输出
*/
代码实现
public class Test {
static char[] commonChars(int count, List<String> strings) {
int[][] counts = new int[strings.size()][128];
//记录每个字符出现的次数
for(int i = 0; i < strings.size(); i++) {
String tmp = strings.get(i);
char[] charArray = tmp.toCharArray();
//记录当前字符串所有字符出现的次数
for(int j = 0; j < charArray.length; j++) {
counts[i][charArray[j]]++;
}
}
//定义变量记录符合条件的字符个数
int resCount = 0;
List<Character> res = new ArrayList<>();
for(int j = 0; j < 128; j++) {
//判断当前字符是否符合次数要求
boolean state = true;
for(int i = 0; i < strings.size();i++) {
if(counts[i][j] < count) {
state = false;
break;
}
}
if(state) {
resCount++;
res.add((char)(j));
}
}
char[] resArr = new char[resCount];
for(int i = 0; i < resCount; i++) {
resArr[i] = res.get(i);
}
return resArr;
}
public static void main(String[] args) {
int k = 2;
List<String> strings = new ArrayList<>();
strings.add("aabbccFFFFx2x2");
strings.add("aaccddFFFFx2x2");
strings.add("aabcdFFFFx2x2");
char[] res = commonChars(k, strings);
Arrays.sort(res);
for(char c:res) {
System.out.print(c + " ");
}
}
}
下面是手撕题
一开始是这道题
/*
重构字符串
给定一个字符串 s ,检查是否能重新排布其中的字母,使得两相邻的字符不同。
返回 s 的任意可能的重新排列。若不可行,返回空字符串 "" 。
示例 1:
输入: s = "aab"
输出: "aba"
示例 2:
输入: s = "aaab"
输出: ""
提示:
1 <= s.length <= 500
s 只包含小写字母
*/
感觉短时间内写不出来,然后问面试官能不能换题,面试官换了一题之后才写出来的
下面是换过的题
/*
公共字符
按ASCII码升序输出所有符合要求的字符; 如果没有符合要求的字符,则输出空列表[]。
样例1
输入:
2 ["aabbccFFFFx2x2", "aaccddFFFFx2x2", "aabcdFFFFx2x2"]
输出:
["2", "F", "a", "x"]
解释:
字符 a 在三个字符串中都出现 2次,符合要求;
字符 b 在第二三个字符串中分别出现 0次、1次,不符合要求;
字符 c 在第三个字符串中出现 1次,不符合要求;
字符 d 在第三个字符串中出现 1次,不符合要求;
字符 F 在三个字符串中都出现了 4 次,符合要求;
字符 x 在三个字符串中都出现了 2 次,符合要求;
字符 2 在三个字符串中都出现了 2 次,符合要求;
因此字符 a、F、x、2符合要求,按ASCII码升序输出
*/
代码实现
public class Test {
static char[] commonChars(int count, List<String> strings) {
int[][] counts = new int[strings.size()][128];
//记录每个字符出现的次数
for(int i = 0; i < strings.size(); i++) {
String tmp = strings.get(i);
char[] charArray = tmp.toCharArray();
//记录当前字符串所有字符出现的次数
for(int j = 0; j < charArray.length; j++) {
counts[i][charArray[j]]++;
}
}
//定义变量记录符合条件的字符个数
int resCount = 0;
List<Character> res = new ArrayList<>();
for(int j = 0; j < 128; j++) {
//判断当前字符是否符合次数要求
boolean state = true;
for(int i = 0; i < strings.size();i++) {
if(counts[i][j] < count) {
state = false;
break;
}
}
if(state) {
resCount++;
res.add((char)(j));
}
}
char[] resArr = new char[resCount];
for(int i = 0; i < resCount; i++) {
resArr[i] = res.get(i);
}
return resArr;
}
public static void main(String[] args) {
int k = 2;
List<String> strings = new ArrayList<>();
strings.add("aabbccFFFFx2x2");
strings.add("aaccddFFFFx2x2");
strings.add("aabcdFFFFx2x2");
char[] res = commonChars(k, strings);
Arrays.sort(res);
for(char c:res) {
System.out.print(c + " ");
}
}
}
全部评论
相关推荐
点赞 评论 收藏
分享
点赞 评论 收藏
分享
05-22 21:07
上海大学 后端 点赞 评论 收藏
分享