博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
部分笔试算法题整理
阅读量:4056 次
发布时间:2019-05-25

本文共 3274 字,大约阅读时间需要 10 分钟。

1、最大字典子序列

给一个字符串,从里面选取子序列,求新组成的最大字典序列。如“ABCAB”,最大字典子序为“CB”。(2018春-爱奇艺)

思路一:先遍历一遍,找到最大的字符C,第二趟从C右边开始遍历,找到最大的字符B,再从B右边开始遍历,右边没有了,结束。时间复杂度为 O(n2) O ( n 2 )

思路二:单调栈,时间复杂度为 O(n) O ( n )

import java.util.Scanner;import java.util.Stack;public class AiQYI1 {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        String s=in.nextLine();        Stack
stack=new Stack<>(); int len=s.length(); for(int i=len-1;i>=0;i--){
//从后往前遍历 if(stack.isEmpty()||stack.peek()

2、放n种糖果进盒子

有n种糖果,每种糖果最少放min[i]个,最多放max[i]个 (0i<n) ( 0 ≤ i < n ) ,盒子里面需要放m个糖果,一共有多少种放法。(2018春-爱奇艺)

思路:先把每种最少需要放的糖果放进去,变成多重背包问题。
来自

import java.util.Scanner;public class AiQYI3 {    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        int n = scanner.nextInt();// 颜色种类        int m = scanner.nextInt();// 盒子放置m个糖果        int[] l = new int[n];        int[] r = new int[n];        int least = 0;        int[] avaliable = new int[n];// 表示每一种颜色剩余可以加的        for (int i = 0; i < r.length; i++) {            l[i] = scanner.nextInt();            r[i] = scanner.nextInt();            least += l[i];            avaliable[i] = r[i] - l[i];        }        int target = m - least; //dp[i][j]表示前i种糖果装满容量为j的背包的方法数。一定要用long,不然会爆,只能过70%         long[][] dp = new long[n + 1][target + 1];        for (int i = 0; i < dp.length; i++) {            dp[i][0] = 1;//初始化        }        for (int i = 1; i <= n; i++) {            for (int j = 1; j <= target; j++) {                for (int k = 0; k <= avaliable[i - 1]; k++) {                    if (j - k >= 0)                        dp[i][j] += dp[i - 1][j - k];                }            }        }        System.out.println(dp[n][target]);    }}

3、给两个人分糖果

有一堆糖果,每个糖果重量不一定一样,分给两个人,两个人的糖果数量之差不超过1,求两个人分到的糖果的最小重量之差。(2018春-科大讯飞)

思路:找其中一份的重量之和与sum/2的最小之差

//转换为求其中一份与sum/2的最小值min,真实最小值为2*minpublic class KDXF {    //全局变量    static float min=Integer.MAX_VALUE;//其中一份与sum/2的最小值min    static float half;//sum/2    public static void main(String[] args) {        //重量数组        float[] weight= {
1,2,3,4,5,100,6}; //sum/2 half=(float) (sum(weight)/2.0); //其中一份糖果重量 如果总数为奇数,为少的那一份 float[] a=new float[weight.length/2]; //回溯 back( weight.length/2,-1,weight, a ); System.out.println((int)(min*2)); } //回溯 n为还需要选几个 i为上一次选取的糖果下标,这个是增序选择的 weight为所有糖果重量 a存放已经选取的糖果重量,倒叙存放,先放a[a.length-1]最后放a[0] public static void back(int n,int i,float[] weight,float[] a ) { if(n==0) {
//当把数组a填满了就计算,计算回溯结束时此路径的min if(Math.abs(sum(a)-half)

4、求x^y的结果对N取余

(2018春-快手)

思路:直接累乘,线性时间复杂度不可取。二分,时间复杂度为 O(logn) O ( l o g n )

import java.util.Scanner;public class Kuaishou1 {    public static void main(String[] args) {        Scanner in = new Scanner(System.in);        long x = in.nextLong();        long y = in.nextLong();        long N = in.nextLong();        if(y<0){            System.out.println((int)1/pow(x,-y));        }else {            System.out.println(pow(x,y,N));        }    }    public static long pow(long a,long b,long N){        if(b==0)return 1;        if(b==1)return a;        if(b%2==0){            return pow(a*a,b/2,N)%N;        }else {            return (pow(a*a,b/2,N)*a)%N;        }    }}

转载地址:http://aehci.baihongyu.com/

你可能感兴趣的文章
企业云盘如何助力商业新发展
查看>>
医疗行业运用企业云盘可以带来什么样的提升
查看>>
媒体广告业如何将内容资产进行高效地综合管理与利用
查看>>
能源化工要怎么管控核心数据
查看>>
媒体广告业如何运用云盘提升效率
查看>>
企业如何运用企业云盘进行数字化转型-实现新发展
查看>>
司法如何运用电子智能化加快现代化建设
查看>>
iSecret&nbsp;1.1&nbsp;正在审核中
查看>>
IOS开发的开源库
查看>>
IOS开发的开源库
查看>>
Jenkins - sonarqube 代码审查
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成(一)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 单机部署(二)
查看>>
Jenkins + Docker + SpringCloud 微服务持续集成 - 高可用集群部署(三)
查看>>
Golang struct 指针引用用法(声明入门篇)
查看>>
Linux 粘滞位 suid sgid
查看>>
C#控件集DotNetBar安装及破解
查看>>
Winform皮肤控件IrisSkin4.dll使用
查看>>
Winform多线程
查看>>
C# 托管与非托管
查看>>