1.六位数最大时间
题目描述:
给定一个数组,里面有6个整数,求这个数组能够表示的最大24进制的时间是多少,输出这个时间,无法表示输出invalid。输入描述:
输入为一个整数数组,数组内有六个整数。
输入整数数组长度为6,不需要考虑其他长度,元素值为0或者正整数,6个数字每个数字只能使用一次。输出描述:
输出为一个24进制格式的时间,或者字符串“invalid”。示例1
输入:
[0,2,3,0,5,6]
输出:
23:56:00
示例2
输入:
[5,5,5,5,5,5]
输出
invalid
解法:我是用的暴力。考虑六位的每一位的情况,第一位最大为二,当第一位是2的时候第二位最大为4.其他情况类似。代码又臭又长就不放了。最后只过了80%,有些情况没考虑到。
2. 流水线组装产品所需时间
题目描述:
流水线上,想要生产 N个产品,每个产品有M个零件,Aij表示组装第i个产品的第j个零件所需时间。流水线一个优点:组装越多次,每次组装所需的时间就越短。但是有两个条件:
1. Aij需要生产出来必须保证Ai-1 j先生产出来
2. Aij需要生产出来必须保证Ai j-1先生产出来
输入描述:
第一行两个整数M,N。接下来是一个N*M的矩阵,精确到小数点后六位。
输出描述:
每组数据输出一个浮点数,精确到后六位
用例1:
1 3
3.0
2.0
1.0
输出:6.000000
用例2:
3 1
3.0 2.0 1.0
输出:6.000000
用例3:
2 4
10.000000 5.000000
4.500000 3.000000
4.499999 2.000000
2.000000 1.000000
输出:21.999999
解法:这题感觉主要是看懂问题。简单来说:根据题目题目中的两个条件,在制作第Aij个零件时,必须保证Ai-1 j 和Ai j-1 两个都已经完成了,这句话可以理解成,如果从开始到完成Ai-1 j 需要10分钟,而从开始到完成Ai j-1需要十五分钟,那么第Aij个需要至少等15分钟使这两个都完成了才可以开始。搞懂这句话,这道题解法基本就出来了,就是一道dp问题。
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
double[][] A = new double[n][m];
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
A[i][j] = sc.nextDouble();
}
}
double[][] dp = new double[n][m];
dp[0][0] = A[0][0];
for (int i = 1; i < n; i++) {
dp[i][0] = dp[i-1][0] + A[i][0];
}
for (int i = 1; i < m; i++) {
dp[0][i] = dp[0][i-1] + A[0][i];
}
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1] + A[i][j]);
}
}
String res = String.format("%.6f", dp[n - 1][m - 1]);
System.out.println(res);
}
}
3.数字字符串组合倒序
题目描述:
对数字,字符,数字串,字符串,以及数字与字符串组合进行倒序排列。
1)字符范围:由 a 到 z,A 到 Z,数字范围:由 0 到 9
2)符号“-”的定义
(1)“-”做为连接符使用时作为字符串的一部分,例如“20-years”作为一个整体字符串呈现;
(2)连续出现 2 个“-”及以上时视为字符串间隔符,如“out--standing"中的“-“视为间隔符,是2个独立整体字符串"out"和"standing";3)除了 1,2 里面定义的字符以外其他的所有字符,都是非法字符,作为字符串的间隔符处理,倒序后间隔符作为空格处理;
4)要求倒排后的单词间隔符以一个空格表示;如果有多个间隔符时,倒排转换后也只介许出现一个字格间隔符:
5)每个数字串或字符串,或者数字,符号,字符串组合长度范围为0-20字节;
6)输入输出的字符串组合数量不超过200个;
7)倒叙,即第一个数字串/字符串倒叙后放在最后,以此类推。
示例:
输入:
I am an 20-years out--standing @ * -stu- dent
输出:
dent stu standing out 20-years an am I
解法:主要考虑那些特殊字符如何处理。我的思路是遍历字符串,将字符串上的每个字符存到字符数组里,其中特殊字符存成空格。然后再次遍历字符数组,以空格为每个字符串/数字串的分割符,拼接属于同一个字符串的字符,存到一个list里。最后再反向遍历list,输出结果。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Scanner;
public class sou3invertstr {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
int len = str.length();
Character[] Str2Char = new Character[len];
for (int i = 0; i < len; i++) {
if (IsUsed(str.charAt(i))){
Str2Char[i] = str.charAt(i);
}else if(str.charAt(i) == '-' && IsUsed(str.charAt(i-1)) && IsUsed(str.charAt(i+1))){
Str2Char[i] = str.charAt(i);
}else {
Str2Char[i] = ' ';
}
}
LinkedList<String> res = new LinkedList<>();
for (int i = 0; i < len; i++) {
if(Str2Char[i] != ' '){
int j = i;
StringBuilder sb = new StringBuilder();
while (j < len && Str2Char[j] != ' '){
sb.append(Str2Char[j]);
j++;
}
res.add(sb.toString());
i = j;
}
}
for (int i = res.size()-1; i >= 0; i--) {
if(i != 0) {
System.out.print(res.get(i)+' ');
}else {
System.out.print(res.get(i));
}
}
}
public static boolean IsUsed(Character p){
if( (p>='a' && p<='z') || (p >= 'A' && p <= 'Z') || (p >= '0' && p <= '9')){
return true;
}else {
return false;
}
}
}