今日面试题

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

问题描述:

给定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);
    }
}

posted @ 2020-03-13 21:10  samsaraaa  阅读(139)  评论(0编辑  收藏  举报