360笔试2020/03/24

记录一下两道编程题,有空的时候再看看

第一题:

有一种特殊的DNA,仅仅由核酸A和T组成,长度为n,顺次连接

科学家有一种新的手段,可以改变这种DNA。每一次,科学家可以交换该DNA上两个核酸的位置,也可以将某个特定位置的核酸修改为另一种核酸。

现在有一个DNA,科学家希望将其改造成另一种DNA,希望你计算最少的操作次数。

输入
输入包含两行,第一行为初始的DNA,第二行为目标DNA,保证长度相同。

输出
输出最少的操作次数


样例输入
ATTTAA
TTAATT
样例输出
3

提示
对于100%的数据,DNA长度小于等于100000
样例解释:
1.首先修改第一个位置的核酸(从A修改为T)
2.交换3和5位置的核酸
3.交换4和6位置的核酸

ac:100%

import java.util.Scanner;

public class First {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String old = sc.nextLine();
        String newStr = sc.nextLine();
        int oldA = 0, newStrA = 0, tong = 0;
        for(int i = 0; i < old.length(); i++){
            if(old.charAt(i) == 'A'){
                oldA++;
                if(newStr.charAt(i) == 'A'){
                    tong++;
                    newStrA++;
                    continue;
                }
            }
            if(newStr.charAt(i) == 'A'){
                newStrA++;
            }
        }
        if(oldA > newStrA){
            System.out.println(oldA - tong);
        } else {
            System.out.println(newStrA - tong);
        }
    }
}

第二题:

A和B两个人在抽奖。现在有一个抽奖箱,里面有n张中奖票,m张不中奖票。A和B轮流从中抽一张奖票出来。如果有人抽到中奖票就结束,抽到中奖票的人胜利。抽过的奖票会被丢弃。

额外的,B每次抽后,会再次抽取一张票并丢弃掉(这张票中奖不算B胜利)。

现在,A先抽,请问A的胜率,保留4位小数后输出。

如果两人到最后也没有抽到中奖票算作B胜利。

输入
输入两个数字n,m,代表中奖票和不中奖票的数量 (0≤n,m≤1000)

输出
输出A的胜率,保留4位小数。


样例输入
2 3
样例输出
0.6000

提示
样例输入2
1 3
样例输出2
0.5000
样例二解释:
如果A第一轮抽到中奖票,A胜利,概率0.25。
如果A第二轮抽到中奖票,情况为A第一轮没有抽到中奖票,B也没有抽到中奖票,并且B丢弃掉的奖票也不是中奖票。概率为3/4 * 2/3 * 1/2=0.25
综上,中奖率为0.5。

ac:100%

import java.util.Scanner;

public class Second {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        double p = getP(n, m, 1.0);
        System.out.println(String.format("%.4f",p));
    }

    public static double getP(int n, int m, double p){
        //跳出条件
        if(n == 0){
            return 0;
        } else if (m == 0) {
            return p;
        }

        //方法体
        double result = 0;
        //A中奖
        result += p * (new Double(n) / (n + m));

        //A未中奖
        m--;
            //还有未中奖牌
        if(m > 0){
            //B未中奖
            m--;
            if(m > 0){
                //B再抽一次未中奖
                result += getP(n, m - 1,p * (new Double(m + 2) / (n + m + 2)) * (new Double(m + 1) / (n + m + 1)) * (new Double(m) / (n + m)));
                //B再抽一次中奖
                result += getP(n - 1, m,p * (new Double(m + 2) / (n + m + 2)) * (new Double(m + 1) / (n + m + 1)) * (new Double(n) / (n + m)));
            }
        }
        return result;
    }
}

 

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值