华为外包l两道面试算法题。

今日下午刚结束面试。一共两技术人员面的,一人出了一道算法题,记录下,并为以后做些准备,由于远程面试,所以没有代码测试,不知道行不行的通,且行且看吧。

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;
  }
   

搞定,心累啊啊啊

发布了8 篇原创文章 · 获赞 0 · 访问量 519

猜你喜欢

转载自blog.csdn.net/jjy19971023/article/details/103786918