友塔游戏技术岗笔试-4.17

先说结果:四题过了半题少一点。
结论:菜是原罪。
第一题:输入一个1000位以内的整数,再输入一个100以内的整数,求两数乘积。(具体题目不是这个,意思是这样,其他题目类似)
思路:大数相乘,原本大数加法都搞半天,直接跳过了。菜是原罪。

第二题:完全二叉树求n个节点的最近祖先节点。
输入:一个整数N表示完全二叉树的节点,接下来N个不重复的由大小写字母组成的节点值,再输入一个整数M表示需要查找的M个节点,接下来M个节点值。
输出:最近公共祖先。
思路:假定完全二叉树节点又一个下标,从1开始递增。比如完全二叉树A B C D E F G可以对应1,2,3,4,5,6,7。如果求E,F,G(5,6,7)的最近祖先,
只需要将对应的下标,即5,6,7转成二进制表示,找出这些二进制字符串的从头开始的最长公共子串,再将其转回整数,再找到整数(即下标)对应的map节点的key值。
结果:只过30%。最后放代码,是我写的唯一一题。菜是原罪。

第三题:一个整型数组,从左往右开始取值,后取到的数不能比前面大,求出和最大的取值(只要输出最大的和)。
思路:以为很简单,其实没思路。菜是原罪。

第四题:Dota英雄卡尔已经切好了三种元素(可以相同),剩下一些魔法值,求出卡尔接下来能最多使用多少个不同的技能。切换元素不消耗魔法,各种技能组合共十种(只有十种说明元素顺序与技能无关),每一种都需要各自的魔法值(值多少忘了,可以自己设定)。
第四题大概的意思是这样,因为我看到这里已经心里发慌了,写肯定是没写,自己脑补吧。菜是原罪。
以上就是我的菜之四重打击,我直到后面还有很多重,可能是跟自己年龄有关系吧,比较都29了,还TM本科毕业生,技术菜人老珠黄,其实我也不知道是不是年龄的问题,更多的是希望是自己菜的原因。这是第一次写面经,希望大家一起学习。最后附上第二题的代码,我今天早上又测试了几次,感觉没错呀。
package 友塔游戏;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String str;
        Map<String ,Integer> map = new HashMap<>();
        for(int i=1;i<=n;i++){
            str = sc.next();
            map.put(str,i);
        }
        int x = sc.nextInt();
        String strings[] = new String[x];
        for(int i=0;i<x;i++){
            strings[i]=sc.next();
        }
        sc.close();
        System.out.println(solution(map,strings));
    }

    public static String solution(Map<String,Integer> map,String[] strings ){
        int n = strings.length;
        String strArray[] = new String[n];
        int tempNum = 0;
        int minLenth = Integer.toBinaryString(map.get(strings[0])).length();
        for(int i=0;i<n;i++){
            int temp = map.get(strings[i]);
            String tempStr = Integer.toBinaryString(temp);
            if(minLenth>tempStr.length()){
                minLenth=tempStr.length();
                tempNum=i;
            }
            strArray[i]= tempStr;
        }
        String str = "1";
        Boolean flag = true;
        for(int i=1;i<tempNum;i++){
            flag = true;
            String temp = strArray[tempNum].substring(i,i+1);
            for(int j=0;j<strArray.length;j++){
                if(!strArray[j].substring(i,i+1).equals(temp)) {
                    flag=false;
                    break;
                }
            }
            if(flag) str= str+temp;
        }
        int num = getBinaryStringNumber(str);
        for(String string:map.keySet()){
            if(map.get(string)==num) return string;
        }
        return null;
    }
    public static int getBinaryStringNumber(String string){
        int re = 1;
        char ch[] = string.toCharArray();
        for (int i=1;i<ch.length;i++){
            re = re*2+(ch[i]-'0');
        }
        return re;
    }
}


#友塔游戏2020春招正在进行中##友塔游戏##笔经##Java工程师##校招#
全部评论
二、三题和我的试卷一样第二题我是把节点的祖先放到HashSet里然后找公共的祖先,比如找D E F的公共祖先,就用3个HashSet分别存了他们各自的祖先,然后随便遍历一个HashSet,判断当前遍历到的节点是否能在其他HashSet找到,并且保留索引最大的第三题常见的dp,网上找一下应该有很多
1 回复
分享
发布于 2020-04-18 12:46
java大数运算直接用BigInteger
点赞 回复
分享
发布于 2020-04-18 11:52
小红书
校招火热招聘中
官网直投
答主最后拿了吗
点赞 回复
分享
发布于 2020-07-28 13:21

相关推荐

3 16 评论
分享
牛客网
牛客企业服务