第一题
在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());
}
}
}