51信用卡校园招聘编程题2107.10.18日

第一题:n个数字串找出出现次数最多的数字串,如果有个,按照字典顺序,输出最小的那个。(注意内存使用)
解题思路:要保证内存不超,建议使用字典树。
          网上找的代码,没来的及提交。没输出最小的那个。字典树理解不深入,求大神帮忙改改程序,输出出现次数最多的那个最小的字符串。
import java.util.Scanner;

/**
 * Created by tzy on 2017/10/18
 * n个小写数字串中出现次数最多的数字串.(如果存在多个,按照字典顺序输出最小的那个。)
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        Main trie = new Main();
        while (scanner.hasNext()){
            int n=scanner.nextInt();
            for (int i = 0; i <n ; i++) {
                String string=scanner.next().trim();
                trie.addWord(string);
            }
            System.out.println(trie.maxCountWord());
        }
    }
    private TrieNode root = new TrieNode();// 字典树的根节点
    private int max;// 统计出现的最大次数
    private String maxWord;// 出现最大次数的字符串
    // 返回出现次数最大的单词
    public String maxCountWord() {
        return maxWord;
    }
    // 向字典树中添加单词
    public void addWord(String word) {
        addWord(root, word, word);// 第二个word是个冗余参数,为了记录增加的单词
    }
    private void addWord(TrieNode vertex, String word, String wordcount) {
        if (word.length() == 0) {
            vertex.words++;
            if (max <=vertex.words) {
                max = vertex.words;
                maxWord = wordcount;
            }
        } else {
            char c = word.charAt(0);
            //c = Character.toLowerCase(c);
            int index = c -'0';
            if (vertex.edges[index] == null) { // 构建节点的路径
                vertex.edges[index] = new TrieNode();
            }
            addWord(vertex.edges[index], word.substring(1), wordcount);
        }
    }

    protected class TrieNode {
        protected int words;// 统计从根到该节点的单词出现的个数
        protected TrieNode[] edges;// 存放该节点的子节点

        public TrieNode() {
            this.words = 0;
            edges = new TrieNode[10];// 题目对于字符没有做出限制,这里默认全是数字
            for (int i = 0; i < edges.length; i++) {
                edges[i] = null;
            }
        }
    }
}

第二题:leetcode上是整数,确定一下小数点的位置就行。
import java.util.Scanner;

/**
 * Created by tzy on 2017/10/18.
 * leetcode上是整数,确定一下小数点的位置就行。
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext()){
            String numl=scanner.next();
            String num2=scanner.next();
            System.out.println(multiply(numl,num2));
        }
    }
    private static String multiply(String num1, String num2) {
        //每个数的小数点后有几位。
        int dian_leng=0;
        int dian_1=num1.indexOf('.');
        int dian_2=num2.indexOf('.');
        if (dian_1>0)
            dian_leng+=num1.length()-1-dian_1;
        if (dian_2>0)
            dian_leng+=num2.length()-1-dian_2;
        num1=num1.replace(".","");
        num2=num2.replace(".","");

        int len1 = num1.length();
        int len2 = num2.length();
        int[] product = new int[len1 + len2];
        for (int i = len1 - 1; i >= 0; i--) {
            for (int j = len2 - 1; j >= 0; j--) {
                int index = len1 + len2 - i - j - 2;
                product[index] += (num1.charAt(i) - '0') * (num2.charAt(j) - '0');
                product[index + 1] += product[index] / 10;
                product[index] %= 10;
            }
        }
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = product.length - 1; i >= 0; i--) {
            if (stringBuilder.length() == 0 && product[i] == 0)
                continue;
            stringBuilder.append(product[i]);
        }

        //确定小数点位置。
        if (stringBuilder.length()<=dian_leng){
            StringBuilder temp=new StringBuilder("0.");
            for (int i = 0; i <dian_leng-stringBuilder.length() ; i++) {
                temp.append(0);
            }
            stringBuilder.insert(0,temp);
        }
        else
            stringBuilder.insert(stringBuilder.length()-dian_leng,".");
        return stringBuilder.toString();
    }
}

#Java工程师##算法工程师#
全部评论
为啥算法岗没有编程题?
点赞 回复
分享
发布于 2017-10-19 14:15

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务