360笔试0928

算法ak

第一题

小X和小Y正在进行加密算法有关的研究。

小X提出了一种简单的加密算法:对于一个只包含小写英文字母的字符串,将’a’替换成1,’b'替换成2.… ’ z’替换成26,比如一个字符串’abcyz’,加密后变成:1232526’。但是小Y觉得对于一个加密后的数字串可能对应很多原串:比如’1232526’可能表示’abcyz’,也可能表示’abcbebf',也可能表示’Icyz’但固执的小X并不想听取小Y的想法。为了说服小X,小Y希望能计算出某个加密后的数字串可能对应的原串个数,由于答案可能很大,请输出答案对1000000007(10^9+7)取模后的结果。

package com.面试中的算法.三六零;

import java.util.Scanner;

/**
 * @author xing'chen
 * @version 1.0
 * @description: TODO
 * @date 2024/9/28 17:38
 */
public class MAIN {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String str= sc.next();
        System.out.println(numdecoding(str));
    }

    private static int numdecoding(String str) {
        int  mod=1000000007;
        int n=str.length();
        int[] dp=new int[n+1];
        dp[0]=1;
        dp[1]=str.charAt(0)=='0'?0:1;
        for (int i=2; i<=n; i++){
            int one = Integer.parseInt(str.substring(i-1,i));//取一位
            int two = Integer.parseInt(str.substring(i-2,i));//取一位
            if (one>=1&&one<=9){
                dp[i]=(dp[i]+dp[i-1])%mod;
            }
            if (two>=10&&two<=26){
                dp[i]=(dp[i]+dp[i-2])%mod;
            }
        }
        return dp[n];
    }
}


第二题

某公司有n名员工,第i名员工具有的能力可以用一个正整数a,描述,称为员工的能力值,现在,公司有一个项目需要交给恰好[n/2]名员工负责。为了保证项目能顺利进行,要求负责该项目的所有员工能力值之和大于等于x。

公司希望你可以帮忙求出,有多少种不同的派遣员工来负责这个项目的方案。上文中,[x]表示大于等于x的最小整数,例如[4]=4,[4.2]=5。认为两个方案不同,当且仅当存在一名员工在一种方案中负责该项目,而在另一种方案中不负责。

package com.面试中的算法.三六零;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * @author xing'chen
 * @version 1.0
 * @description: TODO
 * @date 2024/9/28 17:50
 */
public class Main2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt();
        for (int i = 0; i < T; i++) {
            int n = scanner.nextInt();
            int x=  scanner.nextInt();
            int[] ab=new int[n];
            for (int j = 0; j < n; j++) {
                ab[j]=scanner.nextInt();
            }
            System.out.println(get(n,x,ab));
        }
    }

    private static int get(int n, int x, int[] ab) {
        int acquire=(n+1)/2;
        List<List<Integer>> ans=new ArrayList<List<Integer>>();
        generateCombinate(ab,ans,new ArrayList<Integer>(),0,acquire);
        int valid=0;
        for (List<Integer> combination : ans) {
            int sum=0;
            for (Integer integer : combination) {
                sum+=integer;
            }
            if(sum>=x){
                valid++;
            }
        }
        return valid;
    }
    private static void generateCombinate(int[] ab, List<List<Integer>> ans, ArrayList<Integer> combination, int index, int acquire) {
        if(combination.size()==acquire){
            ans.add(new ArrayList<>(combination));
            return;
        }
        for (int i = index; i <ab.length; i++) {
            combination.add(ab[i]);
            generateCombinate(ab,ans,combination,i+1,acquire);
            combination.remove(ans.size()-1);
        }
    }

}


#你都收到了哪些公司的感谢信?#
全部评论

相关推荐

比亚迪汽车新技术研究院 硬件工程师 总包21左右 硕士
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务