2023.3.31恒生电子笔试题

364 阅读2分钟

第一题

找到从11-n的所有超完全数,并从大到小排序

超完全数:n的长度为len,n的每位数的len次方之和等于n

比如:153 = 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153

1634 = 1^4 + 6^4 + 3^4 + 4^4 = 1534

public class Solution {
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        for (int i = Math.min(10000000,n); i >= 11; i--) {
            if (fun(i)){
                System.out.println(i);
            }
        }
    }

    public static boolean fun(int n) {
        char[] chars = String.valueOf(n).toCharArray();
        int len = chars.length;
        int sum = 0;
        for (char c : chars) {
            sum += Math.pow(c - '0',len);
        }
        return sum == n;
    }
}

第二题

public class Solution {

    /**
     *
     * 输入:10000,7,[1.0, 2.0, 1.0,2.0, 2.0, 3.0, 2.0],2   输出50000.00000
     * 注解:第一天1元买入10000股,第二天卖出20000元
     * 第三天1元买入20000股,第六天卖出60000元,盈利50000元
     *
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 根据输入计算最大收益
     * @param M double浮点型 初始资金
     * @param N int整型 历史价格天数
     * @param historyPrices double浮点型一维数组 N天历史价格
     * @param K int整型 最大允许交易次数
     * @return double浮点型
     */
    
    public static double get_max_profit (double M, int N, double[] historyPrices, int K) {
        //0不操作,奇数最多持有股票数,偶数最多持有钱数
        double[][] dp = new double[N][2 * K + 1];

        dp[0][0] = M;
        for (int i = 1; i < 2 * K + 1; i++) {
            if (i % 2 == 0) {
                dp[0][i] = M;
            }
            else {
                dp[0][i] = M / historyPrices[0];
            }
        }
        for (int i = 1; i < historyPrices.length; i++) {
            for (int j = 1; j < 2 * K + 1; j++) {
                if (j % 2 == 1) {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] / historyPrices[i]);
                }
                else {
                    dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - 1] * historyPrices[i]);
                }
            }
        }
        return dp[historyPrices.length - 1][2 * K] - M;
    }



    public static void main(String[] args) {
        System.out.println(get_max_profit(10000,7,new double[]{1.0, 2.0, 1.0,2.0, 2.0, 3.0, 2.0},2));
    }


}