快手校招真题六

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

    最小代价爬楼梯

    你需要爬上一个N层的楼梯,在爬楼梯过程中, 每阶楼梯需花费非负代价,第i阶楼梯花费代价表示为cost[i], 一旦你付出了代价,你可以在该阶基础上往上爬一阶或两阶。
    你可以从第 0 阶或者 第 1 阶开始,请找到到达顶层的最小的代价是多少。
    N和cost[i]皆为整数,且N∈[2,1000],cost[i]∈ [0, 999]。

    输入描述:
    输入为一串半角逗号分割的整数,对应cost数组,例如

    10,15,20
    输出描述:
    输出一个整数,表示花费的最小代价

    因为这里不一定要上升到,最后一个台阶,所以可能之前的最大值得选择,在最后因为少选择一个而变成了最小值,所以需要在求最大值的大小,比较得出最小的代价

    
    
    
    import java.util.*;
    
    public class Main {
    
        // 统计第一大
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            String[] numStrs = in.nextLine().split(",");
            int[] nums = new int[numStrs.length];
            for (int i = 0;i<numStrs.length;i++){
                nums[i] = Integer.parseInt(numStrs[i]);
            }
            int costLeft = 0;
            int costRight = 0;
            int index = -1;
            // 这里不能纯粹的比较,可能因为之前的和在加入最后一个后变了大小
            while (index < numStrs.length-2){
               if(nums[index+1] < nums[index + 2]){
                   costLeft += nums[index + 1];
                   index = index + 1;
               }else {
                   costLeft += nums[index + 2];
                   index = index + 2;
               }
            }
            index = -1;
            while (index < numStrs.length-2){
                if(nums[index+1] > nums[index + 2]){
                    costRight += nums[index + 1];
                    index = index + 1;
                }else {
                    costRight += nums[index + 2];
                    index = index + 2;
                }
            }
            System.out.println(Math.min(costLeft,costRight));
        }
    
    }
    
    

    动态规划的解题思路

    
    import java.util.*;
    
    public class Main {
    
        // 统计第一大
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            String[] numStrs = in.nextLine().split(",");
            int[] nums = new int[numStrs.length];
            for (int i = 0;i<numStrs.length;i++){
                nums[i] = Integer.parseInt(numStrs[i]);
            }
            // 动态规划解题
    
            int first = nums[0]; int second = nums[1];
            int tmp = 0;
            for (int i=2;i<nums.length;i++){
                 tmp = Math.min(first,second) + nums[i];
                 first = second;
                 second = tmp;
            }
            System.out.println(Math.min(first,second));
        }
    
    }
    
    

    鸡鸭分类

    农场有n只鸡鸭排为一个队伍,鸡用“C”表示,鸭用“D”表示。当鸡鸭挨着时会产生矛盾。需要对所排的队伍进行调整,使鸡鸭各在一边。每次调整只能让相邻的鸡和鸭交换位置,现在需要尽快完成队伍调整,你需要计算出最少需要调整多少次可以让上述情况最少。例如:CCDCC->CCCDC->CCCCD这样就能使之前的两处鸡鸭相邻变为一处鸡鸭相邻,需要调整队形两次。

    输入描述:
    输入一个长度为N,且只包含C和D的非空字符串。
    输出描述:
    使得最后仅有一对鸡鸭相邻,最少的交换次数

    CCDCC
    
    2
    

    这里只需要统计原位置和新位置之差

    
    
    import java.util.*;
    
    public class Main {
    
        // 统计第一大
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            String line = in.nextLine();
            int count = 0;
            int iCount = 0;
            for (int i = 0;i<line.length();i++){
                if (line.charAt(i) == 'C'){
                    iCount += i;
                    count++;
                }
            }
            int m = (count * (count-1))/2;
            System.out.println(iCount - m);
        }
    
    }
    
    

    比特币最佳买卖的时机

    给定一个正整数数组,它的第 i 个元素是比特币第 i 天的价格。

    如果你最多只允许完成一笔交易(即买入和卖出一次),设计一个算法来计算你所能获取的最大利润。

    注意你不能在买入比特币前卖出。

    输入描述:
    正整数数组,为以空格分隔的n个正整数
    输出描述:
    最大利润

    7 1 5 3 6 4
    
    5
    
    
    
    
    import java.util.*;
    
    public class Main {
    
        // 股票交易的问题
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            String[] lines = in.nextLine().split(" ");
            int[] nums = new int[lines.length];
            for (int i=0;i<lines.length;i++){
                nums[i] = Integer.parseInt(lines[i]);
            }
            int dp_i_0 = -nums[0];
            int dp_i_1 = 0;
            for (int i=1;i<nums.length;i++){
                dp_i_1 = Math.max(dp_i_1,dp_i_0 + nums[i]);
                dp_i_0 = Math.max(dp_i_0,-nums[i]);
            }
            System.out.println(Math.max(dp_i_0,dp_i_1));
        }
    
    }
    
    

    相关文章

      网友评论

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

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