Bootstrap

【荣耀笔试8.30】1.六位数最大时间。2.流水线组装产品所需时间。3.数字字符串组合倒序。

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;
        }
    }
}

;