• 今日面试题


    题目一:十六进制转八进制

    问题描述:

    给定n个十六进制正整数,输出它们对应的八进制数。

    输入、输出格式:

    输入的第一行为一个正整数n (1<=n<=10)。
    接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。(时间限制:1.0s,内存限制:512.0MB)

    输出n行,每行为输入对应的八进制正整数。
    【注意】
    输入的十六进制数不会有前导0,比如012A。
    输出的八进制数也不能有前导0。

    解决思路:

    • 本题应先将十六进制数转换成二进制再转换成八进制。

    • 本题存储输入的数组需要用String类型,因为题目告知:每个十六进制数长度不超过100000,而long型变量无法存储这么大的值。

    • 为了方便后面二进制转八进制,可以先在十六进制数前补零。

    • 不要忘记最后的八进制结果要去除前导零。

    解决代码:

    
    import java.util.*;
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            int n = sc.nextInt();
            String[] s = new String[n];   
            for(int i = 0; i < n; i++) {
                s[i] = sc.next();
            }
    
    
            for(int i = 0; i < n; i++) {
                StringBuffer sb = new StringBuffer();   // 存储二进制结果
    
                
                if(s[i].length() * 4 % 3 == 1) {
                    sb.append("00");   // 刚好与多的1位组成3个0,即8进制的1位
                } else if(s[i].length() * 4 % 3 == 2) {
                    sb.append("0");
                }
    
                // 十六进制----->二进制
                for(int j = 0; j< s[i].length(); j++) {
                    switch(s[i].charAt(j)) {
                        case '0':sb.append("0000"); break;
                        case '1':sb.append("0001"); break;
                        case '2':sb.append("0010"); break;
                        case '3':sb.append("0011"); break;
                        case '4':sb.append("0100"); break;
                        case '5':sb.append("0101"); break;
                        case '6':sb.append("0110"); break;
                        case '7':sb.append("0111"); break;
                        case '8':sb.append("1000"); break;
                        case '9':sb.append("1001"); break;
                        case 'A':sb.append("1010"); break;
                        case 'B':sb.append("1011"); break;
                        case 'C':sb.append("1100"); break;
                        case 'D':sb.append("1101"); break;
                        case 'E':sb.append("1110"); break;
                        case 'F':sb.append("1111"); break;
                    }
                }
    
    
                long num = 0;  // 存储八进制结果的每一位
                StringBuffer sf = new StringBuffer();   // 存储八进制结果
    
                // 二进制----->八进制
                for(int m = 0; m < sb.length(); m += 3) {   // 每三位三位地转换
                    // 'c'-'0'------>实现字符到数字的转化
                    num = (sb.charAt(m) - '0') * 4 + (sb.charAt(m + 1) - '0') * 2 + (sb.charAt(m+2) - '0');
                    sf.append(num);
                }
    
                // 去除八进制数的前导0
                if(sf.substring(0,1).equals("0")) {
                    System.out.print(sf.substring(1));
                } else {
                    System.out.print(sf);
                }
    
                System.out.println();
            }
        }
    }
    
    

    题目二:数列排序

    问题描述:

    给定一个长度为n的数列,将这个数列按从小到大的顺序排列。1<=n<=200(时间限制:1.0s,内存限制:512.0MB)

    输入、输出格式:

    第一行为一个整数n。
    第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000。

    输出一行,按从小到大的顺序输出排序后的数列。

    解决思路:

    直接使用Arrays类的sort()即可。

    解决代码:

    
    import java.util.Arrays;
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            int n = sc.nextInt();
            sc.nextLine();
    
            Long[] arr = new Long[n];
            for(int i = 0; i < n; i++) {
                arr[i] = sc.nextLong();
            }
    
            Arrays.sort(arr);
    
            for(int i = 0; i < n; i++) {
                System.out.print(arr[i] + " ");
            }
        }
    
    }
    
    

    题目三:时间转换

    问题描述:

    给定一个以秒为单位的时间t,要求用"H:M:S"的格式来表示这个时间。H表示时间,M表示分钟,而S表示秒,它们都是整数且没有前导的"0"。例如,若t=0,则应输出是"0:0:0";若t=3661,则输出"1:1:1"。(时间限制:1.0s,内存限制:512.0MB)

    输入、输出格式:

    输入只有一行,是一个整数t(0<=t<=86399)。

    输出只有一行,是以"H:M:S"的格式所表示的时间,不包括引号。

    解决代码:

    
    import java.util.Scanner;
    
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
    
            long t = sc.nextLong();
    
            long h = t / 3600;
            long m = (t - h * 3600) / 60;
            long s = t - h * 3600 - m * 60;
            System.out.println(h + ":" + m + ":" + s);
        }
    }
    
    
  • 相关阅读:
    bzoj4289
    bzoj3033
    bzoj3144
    896C
    bzoj4430
    bzoj4455
    bzoj5117
    BZOJ 1564: [NOI2009]二叉查找树
    BZOJ1261: [SCOI2006]zh_tree
    BZOJ1090: [SCOI2003]字符串折叠
  • 原文地址:https://www.cnblogs.com/syhyfh/p/12488965.html
Copyright © 2020-2023  润新知