2018.4.18华为在线笔试

本文包含三个编程挑战:实现一个按字节截取并忽略数字的字符串处理函数;计算特定日期落在星期五的频率;以及计算多个骰子点数总和的概率分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一题

在GBK编码下,请编写一个截取字符串的函数, 输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,同时忽略字符串中的数字后输出最终结果。


输入描述:
一行字符串和待截取的字节数
输出描述:
单独的一行截取后的字符串

示例:

输入
华HUA  
4

输出
华HU

备注:

要保证汉字不被截半个,同时忽略字符串中的数字后输出最终结果。

我的程序(水平有限,有问题评论回复):

import java.util.Scanner;

public class DivideString {

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			String str = scanner.next();
			int num = scanner.nextInt();
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < str.length(); i++) {
				if (str.charAt(i) >= 48 && str.charAt(i) <= 57) {

				} else {
					// 去掉数字,题目傻逼就傻逼在这,我是截取之后才去除数字的,结果通过60%
					sb.append(str.charAt(i));
				}
			}
			// 去掉数字用正则
			// String sb = str.replaceAll("\\d","");
			String string = divideStringByByte(sb.toString(), num);
			System.out.println(string);
		}
	}

	private static String divideStringByByte(String str, int num) throws Exception {
		// TODO Auto-generated method stub
		// 无效输入
		if (str == null || str.length() < 1 || num < 1) {
			return "";
		}
		// 按照GBK编码
		int count = 0;// 中文的个数
		byte[] bs = str.getBytes("GBK");
		int len = bs.length;
		if (num < len) {
			for (int i = 0; i < num; i++) {
				if (bs[i] < 0) {
					count++;
				}
			}
			if (count % 2 == 0) {
				return new String(bs, 0, num, "GBK");
			} else {
				return new String(bs, 0, num - 1, "GBK");
			}
		} else {
			return str;
		}

	}

}

第二题

13号又恰好是星期五真的很特殊吗?也就是说,13号出现在星期五的几率比出现在其它周日的几率大吗?要回答这个问题,

写一个程序计算13日出现在某个星期的次数(在给定的N年时间中)。这个时间段为1900年1月1日到1900+N-1年12月31日。

N为非负整数,不超过400。(1900年1月1日是星期一)

 

输入描述:

1 0

第一个参数为years,表示距离1900年1月1日的年数

第二个参数为weeks,表示星期数(分别用0——6代表星期日到星期六)

输出描述:

13日出现在星期数为weeks的次数,若异常失败输出-1

 

示例1

输入

1 0

输出

1

我的程序:

import java.util.Calendar;
import java.util.Scanner;

public class FridayTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int years = scanner.nextInt();
			int weeks = scanner.nextInt();

			Calendar calendar = Calendar.getInstance();
			int count = 0;
			int week = 0;
			for (int j = 0; j < years; j++) {
				for (int i = 0; i < 12; i++) {
					calendar.set(1900 + j, i, 13);
					week = calendar.get(Calendar.DAY_OF_WEEK)-1;
					if (week == weeks) {
						count++;
					}
				}
			}
			System.out.println(count);
		}
	}

}

第三题

有N个骰子,同时投掷出去,向上面的数字之和为 A。那么输入为N个筛子,请计算出A,和他出现的概率。

概率值,小数点保留5位。

 

输入描述:

N,骰子数目

输出描述:

[[1, 0.16667], [2, 0.16667], [3, 0.16667], [4,0.16667], [5, 0.16667], [6, 0.16667]]

输出为二维数组。每一个值,第一个表示数字, 第二个表示概率。

 

示例1

输入

1

输出

[[1, 0.16667], [2, 0.16667], [3, 0.16667], [4,0.16667], [5, 0.16667], [6, 0.16667]]

我的程序:

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

public class DiceSum {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int n = scanner.nextInt();
			int[][] dp = new int[n + 1][6 * n + 1];
			for (int i = 1; i <= 6; i++) {
				dp[1][i] = 1;
			}
			for (int i = 2; i <= n; i++) {
				for (int j = i; j <= i * 6; j++) {
					int x = 0;
					for (int k = 1; k <= 6; k++) {
						if (j > k) {
							x += dp[i - 1][j - k];
						}
					}
					dp[i][j] = x;
				}
			}
			ArrayList<ArrayList<String>> out = new ArrayList<>();
			for (int i = n; i <= 6 * n; i++) {
				ArrayList<String> list = new ArrayList<>();
				list.add(i + "");
				// String result = dp[n][i]+"";//输出次数
				String result = String.format("%.5f", ((double) dp[n][i]) / (n * 6));//输出概率
				list.add(result);
				out.add(list);
			}
			System.out.println(out.toString());
		}
	}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值