算法与实战大数据,机器学习,人工智能大数据 爬虫Python AI Sql

快手校招真题四

2020-05-19  本文已影响0人  Tim在路上

最少数量货物装箱问题

题目描述
有重量分别为3,5,7公斤的三种货物,和一个载重量为X公斤的箱子(不考虑体积等其它因素,只计算重量)
需要向箱子内装满X公斤的货物,要求使用的货物个数尽可能少(三种货物数量无限)

输入描述:
输入箱子载重量X(1 <= X <= 10000),一个整数。
输出描述:
如果无法装满,输出 -1。
如果可以装满,输出使用货物的总个数。

4

-1

import java.util.*;

public class Main {

    // 完全背包问题,只是要求必须装满

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int x = in.nextInt();
        if (x < 8){
            if(x == 3 || x == 5 || x == 7){
                System.out.println(1);
            }else if (x == 6){
                System.out.println(2);
            }else{
                System.out.println(-1);
            }
        }else {
            // 使用贪心法
            int[] dp = new int[x + 1];
            // 求最小 先赋值最大
            for (int i = 0; i <= x; i++) {
                dp[i] = x + 1;
            }
            dp[3] = 1;
            dp[5] = 1;
            dp[7] = 1;
            dp[6] = 2;
            for (int i = 8; i < x + 1; i++) {
                dp[i] = Math.min(dp[i - 3], Math.min(dp[i - 5], dp[i - 7]))+1;
            }
            System.out.println(dp[x]);
        }
    }
}

回文子串的个数

题目描述
给定一个字符串,你的任务是计算这个字符串中有多少个回文子串。
("回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。)
具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被计为是不同的子串。
可用C++,Java,C#实现相关代码逻辑
输入描述:
输入一个字符串S 例如“aabcb”(1 <= |S| <= 50), |S|表示字符串S的长度。
输出描述:
符合条件的字符串有"a","a","aa","b","c","b","bcb"

所以答案:7


import java.util.*;

public class Main {

    // 完全字符串dp问题,

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.nextLine();
        boolean[][] dp = new boolean[line.length()][line.length()];
        int count = line.length();
        for (int i=0;i<line.length();i++){
            dp[i][i] = true;
        }
        // 这里一定要注意这里要逆序,否则,dp[i][j] = dp[i+1][j-1];,dp[i+1][] 还没计算
        for (int i=line.length()-2;i>=0;i--){
            for (int j=i+1;j<line.length();j++){
                if (j - i <=1 && line.charAt(i) == line.charAt(j)){
                    dp[i][j] = true;
                }else if (line.charAt(i) == line.charAt(j)){
                    dp[i][j] = dp[i+1][j-1];
                }
                if (dp[i][j]){
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

字符串压缩

对字符串进行RLE压缩,将相邻的相同字符,用计数值和字符值来代替。例如:aaabccccccddeee,则可用3a1b6c2d3e来代替。

输入描述:
输入为a-z,A-Z的字符串,且字符串不为空,如aaabccccccddeee
输出描述:
压缩后的字符串,如3a1b6c2d3e




import java.util.*;

public class Main {

    // 完全字符串dp问题,

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 字符串压缩,采用,顺序遍历的思路
        String line = in.nextLine();
        char[] lineChar = line.toCharArray();
        int left = 0;
        char pre = line.charAt(0);
        StringBuilder res = new StringBuilder();
        for(int i=1;i<lineChar.length;i++){
            if (lineChar[i] != pre){
                res.append(i-left);
                res.append(pre);
                pre = lineChar[i];
                left = i;
            }
        }
        res.append(lineChar.length-left);
        res.append(pre);
        System.out.println(res.toString());
    }
}

解析加减法运算

解析加减法运算
如:
输入字符串:"1+2+3" 输出:"6"
输入字符串:"1+2-3" 输出:"0"
输入字符串:"-1+2+3" 输出:"4"
输入字符串:"1" 输出:"1"
输入字符串:"-1" 输出:"-1"

已知条件:输入的运算都是整数运算,且只有加减运算
要求:输出为String类型,不能使用内建的eval()函数

输入描述:
输入字符串:"1+2+3"

输出描述:
输出:"6"


import java.util.*;

public class Main {

    // 解析加减法,转换为只有加法,减法转为负数即可

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.nextLine();
        int sum = 0;
        int i = 0;
        while (i < line.length()){
            int num = 0;int flag = 1;
            if (line.charAt(i) == '-' || line.charAt(i) == '+'){
                if(line.charAt(i) == '-')
                flag = -1;
                i++;
            }
            while (i < line.length() && line.charAt(i) >= '0' && line.charAt(i) <= '9'){
                num = num * 10 + (line.charAt(i) - '0');
                i++;
            }
            sum += flag * num;
        }
        System.out.println(sum);
    }
}

求连续子数组的最大和

题目描述
一个非空整数数组,选择其中的两个位置,使得两个位置之间的数和最大。
如果最大的和为正数,则输出这个数;如果最大的和为负数或0,则输出0
输入描述:
3,-5,7,-2,8
输出描述:
13


import java.util.*;

public class Main {

    // dp 连续子数组最大和

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String line = in.nextLine();
        String[] numStrs = line.split(",");
        int[] nums = new int[numStrs.length];
        for (int i=0;i<numStrs.length;i++){
            nums[i] = Integer.parseInt(numStrs[i]);
        }
        int curMax = 0;
        int max = Integer.MIN_VALUE;
        for (int x:nums){
            if (curMax <= 0){
                curMax = x;
            }else {
                curMax += x;
            }
            max = Math.max(max,curMax);
        }
        if (max <= 0){
            System.out.println(0);
        }else {
            System.out.println(max);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读