今日下午刚结束面试。一共两技术人员面的,一人出了一道算法题,记录下,并为以后做些准备,由于远程面试,所以没有代码测试,不知道行不行的通,且行且看吧。
1、输入为String 字母卡片(可以重复)和一个单词,问利用字母卡片是否能拼出单词。
事例:字母卡片“Zoos”,单词“Zoo”
答案是可以的输出true
如果单词是“Zoom”
输出为FALSE
/*我一共给他说了两个解法,并写出了代码,
第一个是利用数组实现的,效率不高,在这就不写了,简单说下思路吧,
就是把这两个输入都转换成数组,
然后对单词数组的每一个挨个比较卡片是否有,
若是有就将这两个为位置的字符用特殊字符如数字1代替
表明可以匹配的上且卡片也用掉了,遍历完接下来,
看字母数组是否全是特殊字符,若是,则返回真,否则为假
第二个解法是医用hash表进行操作,在这边写下吧*/
public boolean canweDo(String card,String world){
boolean flag=true;
Map<character,Integer> cardMap=new HashMap<>();
Map<character,Integer> worldMap=new HashMap<>();//整形用于存储字母出现的次数
//接下来初试化两个表
int num1=card.length;
for(int i=0;i<num1;i++){
int k=0;
char a=card.charAt(i)
if(cardMap.containsKey(a)){
k=cardMap.get(i);
k++;
}
cardMap.put(a,k);
}
int num2=world.length;
for(int i=0;i<num2;i++){
int k=0;
char a=world.charAt(i)
if(worldMap.containsKey(a)){
k=worldMap.get(i);
k++;
}
worldMap.put(a,k);
}
//接下来进行判断了,首先看是否有所有的单词
Set set1=cardMap.keySet();
Set set2=worldMap.keySet();
//再看字母卡片数目是否足够
return flag;
}
第二道题目是求一个整形数组的最大连续子串的长度,
我是利用一个二维数组蛮力解决所有的子串,再根据值在二维数组的位置找到
连续子串的长度的。
public int lengthMaxSub(int[] a){
int[][] max1=new int[a.length][a.length];
for(int i=0;i<a.length;i++)
for(int j=i;j<a.length;j++)
max1[i][j]=cal(a,i,j);//函数调用计算子串值
int tempMax=0;
for(int i=0;i<a.length;i++)
for(int j=i;j<a.length;j++)
tempMax=Max(temp,a[i][j]);//找到最大值
int k=0,t=0;
for(;t<a.length;t++){
while(max1[t][k]!=temp)
k++;
if(max1[t][k]!=temp)
break;
else k=0;
}
return (k-t);
}
public int cal(int[] a,int k,int j){
int temp=0;
for(int i=k;i<=j;i++)
temp=temp+a[i];
return temp;
}
搞定,心累啊啊啊