您的位置:首页 > 编程语言

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

2017-04-08 11:22 603 查看

题目描述
小明同学要参加一场考试,考试一共有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
;
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
[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
;
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());
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息