We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
小明的女朋友最喜欢在网上买买买了,可是钱包里钞票有限,不能想买啥就买啥。面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时总价格还不能超过预算上限。于是她请小明写程序帮她找出应该买哪些物品,并算出这些物品的总价格。
输入规范: 每个输入包含两行。第一行是预算上限。第二行是用空格分隔的一组数字,代表每种物品的价格。所有数字都为正整数并且不会超过10000。
输出规范: 对每个输入,输出应买物品的总价格。
输入示例1: 100 50 50 输出示例1: 100
输入示例2: 188 50 42 9 15 105 63 14 30 输出示例2: 160
package com.draper; import java.util.Arrays; import java.util.Scanner; public class Consume { public static void main(String[] args) { System.out.println(solution()); } private static int solution() { Scanner scanner = new Scanner(System.in); Integer total = scanner.nextInt(); scanner.nextLine(); String line = scanner.nextLine(); String[] priceStr = line.split(" "); // 一件物品都没有 if (priceStr.length == 0) { return 0; } // 只有一件物品 if (priceStr.length == 1) { if (Integer.valueOf(priceStr[0]) < total) { return Integer.valueOf(priceStr[0]); } else { return 0; } } int[] priceInteger = new int[priceStr.length]; for (int i = 0; i < priceStr.length; i++) { priceInteger[i] = Integer.valueOf(priceStr[i]); } return calculate(total, priceInteger); } private static int calculate(int total, int[] prices) { int sum = 0; int flag = 0; Arrays.sort(prices); for (int i = 0; i < prices.length; i++) { flag = sum; if (sum < total) { if (flag + prices[i] <= total) sum = flag + prices[i]; } } return sum; } }
李雷和韩梅梅坐前后排,上课想说话怕被老师发现,所以改为传小纸条。为了不被老师发现他们纸条上说的是啥,他们约定了如下方法传递信息: 将26个英文字母(全为大写),外加空格,一共27个字符分成3组,每组9个。也就是ABCDEFGHI是第一组,JKLMNOPQR是第二组,STUVWXYZ是第三组(此处用代表空格)。 然后根据传递纸条那天的日期,改变字母的位置。 先根据月份数m,以整个分组为单位进行循环左移,移动(m-1)次。 然后根据日期数d,对每个分组内的字符进行循环左移,移动(d-1)次。 以3月8日为例,首先移动分组,3月需要循环左移2次,变成: STUVWXYZ*,ABCDEFGHI,JKLMNOPQR 然后每组内的字符,8日的话需要循环左移7次,最终的编码为: Z*STUVWXY,HIABCDEFG,QRJKLMNOP 对于要传递信息中的每个字符,用组号和组内序号两个数字来表示。 如果在3月8日传递信息“HAPPY”,那么H位于第2组的第1个,A位于第2组第3个,P位于第3组第9个,Y位于第1组第9个,所以纸条上会写成: 21 23 39 39 19 现在给定日期和需要传递的信息,请输出应该写在纸条上的编码。
输入规范: 每个输入包含两行。第一行是用空格分隔的两个数字,第一个数字是月份,第二个数字是日子。输入保证是一个合法的日期。 第二行为需要编码的信息字符串,仅由A~Z和空格组成,长度不超过1024个字符。
输出规范: 对每个输入,打印对应的编码,数字之间用空格分隔,每个输出占一行。
输入示例1: 1 1 HI 输出示例1: 18 19
输入示例2: 3 8 HAPPY 输出示例2: 21 23 39 39 19
输入示例3: 2 14 I LOVE YOU 输出示例3: 35 25 18 12 29 31 25 23 12 28
package com.draper; import java.util.Scanner; public class SecretMessage { private static String[] base = {"ABCDEFGHI", "JKLMNOPQR", "STUVWXYZ "}; private static String[] str1 = base[0].split(""); private static String[] str2 = base[1].split(""); private static String[] str3 = base[2].split(""); private static String[][] doubleArrays = {str1, str2, str3}; /** * 主要思想是根据原始坐标,按照日期进行相应的计算,然后得出相应的坐标 * 时间复杂度除了计算原始坐标花了时间为 O(n^2)以外,其余均为 O(1) * * @param args */ public static void main(String[] args) { System.out.println(solution()); } /** * 处理输入输出 * * @return */ public static String solution() { Scanner scanner = new Scanner(System.in); String dateStr = scanner.nextLine(); String[] dateStrs = dateStr.split(" "); Integer month = Integer.valueOf(dateStrs[0]); Integer day = Integer.valueOf(dateStrs[1]); String line = scanner.nextLine(); String result = ""; String[] chars = line.split(""); for (String aChar : chars) { int[] resultIndex = indexOfDate(month, day, aChar); result = result + " " + resultIndex[0] + "" + resultIndex[1]; } if (result.startsWith(" ")) result = result.substring(1); return result; } /** * 根据日期的变化,查找目标字符变化过后的坐标 * 核心思想是使用了字符串三次旋转得到字符串左移位后的值 * 但这里只求坐标,所以只要将坐标进行计算 * * @param month * @param day * @param target 目标字符 * @return */ public static int[] indexOfDate(int month, int day, String target) { int[] index = indexOf(doubleArrays, target); int blockIndex = (index[0] + 1 - (month - 1)) % 3; if (blockIndex == 0) { blockIndex = 3; } if (blockIndex < 0) { blockIndex = blockIndex + 3; } int spanIndex = (index[1] + 1 - (day - 1)) % 9; if (spanIndex < 0) { spanIndex = spanIndex + 9; } if (spanIndex == 0) { spanIndex = 9; } return new int[]{blockIndex, spanIndex}; } /** * 将三组字符串中,目标字符的原始坐标计算出来 * * @param arrays 传入基本数组,分为三块,其中每一块是一个 String 数组 * @param target 查找的目标 * @return 原始坐标 */ public static int[] indexOf(String[][] arrays, String target) { for (int i = 0; i < arrays.length; i++) { for (int i1 = 0; i1 < arrays[i].length; i1++) { if (arrays[i][i1].equals(target)) { return new int[]{i, i1}; } } } return null; } }
The text was updated successfully, but these errors were encountered:
No branches or pull requests
题目1
小明的女朋友最喜欢在网上买买买了,可是钱包里钞票有限,不能想买啥就买啥。面对琳琅满目的物品,她想买尽可能多的种类,每种只买一件,同时总价格还不能超过预算上限。于是她请小明写程序帮她找出应该买哪些物品,并算出这些物品的总价格。
输入规范:
每个输入包含两行。第一行是预算上限。第二行是用空格分隔的一组数字,代表每种物品的价格。所有数字都为正整数并且不会超过10000。
输出规范:
对每个输入,输出应买物品的总价格。
输入示例1:
100
50 50
输出示例1:
100
输入示例2:
188
50 42 9 15 105 63 14 30
输出示例2:
160
题目2
李雷和韩梅梅坐前后排,上课想说话怕被老师发现,所以改为传小纸条。为了不被老师发现他们纸条上说的是啥,他们约定了如下方法传递信息:
将26个英文字母(全为大写),外加空格,一共27个字符分成3组,每组9个。也就是ABCDEFGHI是第一组,JKLMNOPQR是第二组,STUVWXYZ是第三组(此处用代表空格)。
然后根据传递纸条那天的日期,改变字母的位置。
先根据月份数m,以整个分组为单位进行循环左移,移动(m-1)次。
然后根据日期数d,对每个分组内的字符进行循环左移,移动(d-1)次。
以3月8日为例,首先移动分组,3月需要循环左移2次,变成:
STUVWXYZ*,ABCDEFGHI,JKLMNOPQR
然后每组内的字符,8日的话需要循环左移7次,最终的编码为:
Z*STUVWXY,HIABCDEFG,QRJKLMNOP
对于要传递信息中的每个字符,用组号和组内序号两个数字来表示。
如果在3月8日传递信息“HAPPY”,那么H位于第2组的第1个,A位于第2组第3个,P位于第3组第9个,Y位于第1组第9个,所以纸条上会写成:
21 23 39 39 19
现在给定日期和需要传递的信息,请输出应该写在纸条上的编码。
输入规范:
每个输入包含两行。第一行是用空格分隔的两个数字,第一个数字是月份,第二个数字是日子。输入保证是一个合法的日期。
第二行为需要编码的信息字符串,仅由A~Z和空格组成,长度不超过1024个字符。
输出规范:
对每个输入,打印对应的编码,数字之间用空格分隔,每个输出占一行。
输入示例1:
1 1
HI
输出示例1:
18 19
输入示例2:
3 8
HAPPY
输出示例2:
21 23 39 39 19
输入示例3:
2 14
I LOVE YOU
输出示例3:
35 25 18 12 29 31 25 23 12 28
The text was updated successfully, but these errors were encountered: