编程题(1):笔试题-京东软件测试2018实习招聘

题目描述
									

小明同学要参加一场考试,考试一共有n道题目,小明必须做对至少60%的题目才能通过考试。考试结束后,小明估算出每题做对的概率,p1,p2,...,pn。

你能帮他算出他通过考试的概率吗?

输入

输入第一行一个数n(1<=n<=100),表示题目的个数。第二行n个整数,p1,p2,...,pn。表示小明有pi%的概率做对第i题。(0<=pi<=100)

样例输入

4

50 50 50 50

输出

小明通过考试的概率,最后结果四舍五入,保留小数点后五位。

样例输出

0.31250

时间限制 C/C++语言:1000MS 其它语言:3000MS
内存限制
package cn.com.jingdong;

import java.util.Scanner;

public class Main1 {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		while(sc.hasNext()){
			int n = sc.nextInt();
			double[] p = new double[n];
			double[][] dp = new double[n+1][n+1];
			dp[0][0] = 1;
			for( int i=0;i<n;i++){
				p[i] = sc.nextInt()/100.0;
			}
			for(int i=1;i<=n;i++){
				dp[i][0] = dp[i-1][0]*(1-p[i-1]);
				for(int j =1;j<=i;j++){
					dp[i][j] = dp[i-1][j-1]*p[i-1]+dp[i-1][j]*(1-p[i-1]);
				}
			}
			
			double result = 0; 
			for(int i =(3*n+4)/5;i<=n;i++){
				result += dp[n][i];
			}
			
//			BigDecimal   b   =   new   BigDecimal(result);  
//			double   f1   =   b.setScale(5,   BigDecimal.ROUND_HALF_UP).doubleValue(); //四舍五入,保留小数点后5位
			System.out.println(String.format("%.5f", result)); //四舍五入,保留小数点后5位,以后做题选择这种方式	
		}
	}
}

站队(京东2017实习生真题)
									题目描述
									

有一条很长的队伍,队伍里面一共有n个人。所有的人分为三类:警察,小偷和普通人。将队伍里面的人从前到后由1到n编号,编号为i的人与编号为j的

人的距离为i与j之差的绝对值。

每一个警察有一个能力值x,表示他能够监视与他距离不超过x的所有人,小偷被警察发现当且仅当他被一个或多个警察监视到。你知道在整条队伍中,

一共有多少个小偷会被警察发现吗?

输入

输入有两行,第一行一个数n(1<=n<=100000),接下来一行有一个长度为n的字符串,依次表示队伍中的每一个人。如果某一位是1-9的某个数字x,表示这一位是一个能力值为x的警察;如果某一位是字符X表示这一位是小偷;如果某一位是字符#表示这是一个普通人。输入保证不会出现其它字符。

样例输入

9

X1X#2X#XX

输出

输出一个数,整条队伍中被警察发现的小偷总数。 

样例输出

3

时间限制 C/C++语言:2000MS 其它语言:4000MS
内存限制 C/C++语言:65536KB 其它语言:589824KB
方法一:
package cn.com.jingdong;

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

public class Main2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		String str = sc.nextLine();
		// 不妨利用数组T(此处用的是list)储存小偷的位置,顺序读取字符串,当读取到X即小偷时,向数组T中记录小偷位置。如:Ti=j表示队列位置j处有一个小偷,该小偷是顺序读取的第i个小偷。
		List<Integer> list = new ArrayList<Integer>();
		// 利用数组P记录警察的监视范围,数组P长度和字符串长度相同,初始状态均为0,顺序读取字符串,当遇到数字即警察时,
		//令:Pjk= 1.....Pj+k= 1表示队列jk到j+k处于监视范围内。j表示警察的位置,k表示警察的监视范围。
		int[] p = new int[n];
		for (int i = 0; i < n; i++) {
			char temp = str.charAt(i);
			if (temp == 'X') {
				list.add(i);
			} else if ('1' <= temp && temp <= '9') {
				int left = Math.max(0, i - (temp - '0'));
				int right = Math.min(i + (temp - '0'), n - 1);
				for (int x = left; x <= right; x++) {
					p[x] = 1;
				}
			}
		}
		int count = 0;
		//如果:PTi= 1表示第i个小偷处于监视范围内。令:count=count+ 1
		for (int i = 0; i < list.size(); i++) {
			if (p[list.get(i)] == 1) {
				count++;
			}
		}
		System.out.println(count);
	}

}
方法二:
package cn.com.jingdong;

import java.util.Scanner;

public class Main3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		sc.nextLine();
		String str = sc.nextLine();
		char[] a = str.toCharArray();
		int count = 0;
		for (int i = 0; i < n; i++) {
			char temp = a[i];
			if ('1' <= temp && temp <= '9') {
				//left,right为警察可以监视的范围
				int left = Math.max(0, i - (temp - '0'));
				int right = Math.min(i + (temp - '0'), n - 1);
				for (int x = left; x <= right; x++) {
					if(a[x]=='X'){//在可监视范围内,遇到小偷就+1,并把小偷转换为普通人,防止之后再多次技术
						count++;  
						a[x]='#'; 
					}
				}
			}
		}

		System.out.println(count);
		System.out.println(str);
	}

}


方法三:
package cn.com.jingdong;
import java.util.HashSet;
import java.util.Scanner;

public class Main3 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		String s = sc.next();
		HashSet<Integer> set = new HashSet<>();//存放可监视范围内的小偷所在位置索引,用set可以去除重复计数的小偷
		for (int i = 0; i < n; i++) {
			if (Character.isDigit(s.charAt(i))) {
				int k = s.charAt(i) - '0';
				if (k == 0)
					continue;
				int l = Math.max(0, i - k);
				int r = Math.min(n - 1, i + k);
				for (int x = l; x <= r; x++) {
					if (s.charAt(x) == 'X')
						set.add(x);
				}
			}
		}
		System.out.println(set.size());
	}
}



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值