快手校招真题五

作者: Tim在路上 | 来源:发表于2020-05-20 10:09 被阅读0次

    字符串最大乘积

    题目描述
    已知一个字符串数组words,要求寻找其中两个没有重复字符的字符串,使得这两个字符串的长度乘积最大,输出这个最大的乘积。如:
    words=["abcd","wxyh","defgh"], 其中不包含重复字符的两个字符串是"abcd"和"wxyh",则输出16
    words=["a","aa","aaa","aaaa"], 找不到满足要求的两个字符串,则输出0
    输入描述:
    Input:

    ["a","ab","abc","cd","bcd","abcd"]
    输出描述:
    Output:

    4

    
    
    
    import java.util.*;
    
    public class Main {
    
        // 统计第一大
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            String line = in.nextLine();
            String[] words = line.substring(1, line.length() - 1).split(",");
            int max = 0;
            for (int i=0;i<words.length-1;i++){
                for (int j=i+1;j<words.length;j++){
                    if (!isDup(words[i],words[j])){
                        // 这里主要原输入字符带双引号
                        int len = (words[i].length()-2) * (words[j].length()-2);
                        max = Math.max(max,len);
                    }
                }
            }
            System.out.println(max);
        }
    
        // 判断两个字符串是否有重复字符
        public static boolean isDup(String s1, String s2){
            for (int i=0;i<26;i++){
                String c = (char) ('a' + i) + "";
                if(s1.contains(c) && s2.contains(c)){
                    return true;
                }
            }
            return false;
        }
    }
    
    

    今年的第几天

    输入年、月、日,计算该天是本年的第几天。

    输入:

    包括三个整数年(1<=Y<=3000)、月(1<=M<=12)、日(1<=D<=31)。

    输出:

    输入可能有多组测试数据,对于每一组测试数据,

    输出一个整数,代表Input中的年、月、日对应本年的第几天。

    输入描述:
    输入:1990 9 20
    输出描述:
    输入:263

    import java.util.*;
    
    public class Main {
    
        // 统计第一大
    
        static int[] months = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int year = in.nextInt();
            int month = in.nextInt();
            int day = in.nextInt();
            int total = 0;
            boolean leap = isLeap(year);
            for (int i=1;i<month;i++){
               if (leap && i == 2){
                   total += 1;
               }
               total += months[i];
            }
            System.out.println(total+day);
    
        }
    
        public static boolean isLeap(int year){
            if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
                return true;
            }
            return false;
        }
    
    }
    
    

    数字序列的第n位值

    有一个无限长的数字序列1,2,2,3,3,3,4,4,4,4,5,5,5,5,5。。。(数字序列从1开始递增,且数字k在该序列中正好出现k次),求第n项是多少
    输入描述:
    输入为一个整数n
    输出描述:
    输出一个整数,即第n项的值

    public class Main {
    
        // 统计第一大
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            int n = in.nextInt();
            int copy = n;
            for (int i=1;i<=copy;i++){
                n = n - i;
                if (n <= 0){
                    System.out.println(i);
                    break;
                }
            }
        }
    
    }
    

    a/b

    求a/b的小数表现形式。如果a可以整除b则不需要小数点。如果是有限小数,则可以直接输出。如果是无限循环小数,则需要把小数循环的部分用"()"括起来。

    输入描述:
    两个整数a和b,其中

    0 <= a <= 1000 000

    1 <= b <= 10 000
    输出描述:
    一个字符串,该分数的小数表现形式

    1 6

    0.1(6)

    import java.util.*;
    public class Main{
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = a%b;//余数是本题的关键
            int d = a/b;
            System.out.print(d);//打印整数部分
            if(c == 0) return;
            System.out.print(".");//打印小数点
            List<Integer> v1 = new ArrayList<>();//每一步的商数
            List<Integer> v2 = new ArrayList<>();//每一步的余数,有相同余数的时候开始循环
            v2.add(c);
            boolean flag = true;//标记是否循环
            int p = 0;//标记循环开始的位数
            while(true){
                // 这里只用乘以10 ,可以保存每一位0
                int temp = 10*c;//每一步的余数乘10,变成下一步的被除数
                int e = temp/b;
                int f = temp%b;//这次的余数
                v1.add(e);
                if(f == 0){
                    flag = false;//除尽了,就不是循环小数
                    break;
                }
                if(v2.contains(f)) {
                    p = v2.indexOf(f);//标记循环开始的位数
                    break;
                }
                v2.add(f);
                c = f;//更新余数
            }
            for(int i = 0; i < v1.size(); ++i) {//打印小数部分
                if(flag && i == p) System.out.print("(");//循环开始时,打一个括号
                System.out.print(v1.get(i));
            }
            if(flag) System.out.print(")");//循环小数收尾的括号
        }
    }
    

    相关文章

      网友评论

        本文标题:快手校招真题五

        本文链接:https://www.haomeiwen.com/subject/aakgohtx.html