天梯赛每日打卡01(1-6题解)

Posted Huterox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了天梯赛每日打卡01(1-6题解)相关的知识,希望对你有一定的参考价值。

文章目录

前言

总得来说,蓝桥杯的打击不小,所以本次继续每日打卡,每日>=6题,按照顺序从PTA 开始基础训练。
打卡第一天

刷不死就往死里刷。这里会按照,我对题目的难易程度进行一个简单排序。

L1-001 Hello World (5 分)


适应一下格式呗

import java.util.Scanner;
public class Main
    public static void main(String[] args)
        Scanner Scanner = new Scanner(System.in);
        System.out.println("Hello World!");
    

L1-004 计算摄氏温度 (5 分)

import java.util.Scanner;

public class Main
    public static void main(String[] args)
        Scanner scanner = new Scanner(System.in);
        int c = scanner.nextInt();
        c = 5*(c-32)/9;
        System.out.println("Celsius = "+c);
    

L1-003 个位数统计 (15 分)

import java.util.Scanner;

public class Main 

    static int[] count;
    public static void main(String[] args) 

        Scanner scanner = new Scanner(System.in);
        String InputString = scanner.next();
        count = new int[10];
        scanner.close();

        for (char c : InputString.toCharArray()) 
            count[c-'0']++;
        
        for (int i = 0; i < count.length; i++) 
            if(count[i]!=0)
                System.out.println(i+":"+count[i]);
            
        

    


L1-005 考试座位号 (15 分)

注意点

这个题目其实很简单,主要还是输入优化的问题,Scanner 不行,没这个能力知道吧。


import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;


/** Class for buffered reading int and double values */
class Reader 
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /**
     * call this method to initialize reader for InputStream
     */
    static void init(InputStream input) 
        reader = new BufferedReader(
                new InputStreamReader(input));
        tokenizer = new StringTokenizer("");
    

    /**
     * get next word
     */
    static String next() throws IOException 
        while (!tokenizer.hasMoreTokens()) 
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(
                    reader.readLine());
        
        return tokenizer.nextToken();
    

    static int nextInt() throws IOException 
        return Integer.parseInt(next());
    

    static double nextDouble() throws IOException 
        return Double.parseDouble(next());
    


public class Main 

    static Student[] Students;


    public static void main(String[] args) throws IOException 
        Reader.init(System.in);
        int N = Reader.nextInt();
        Students = new Student[N+1];
        for (int i = 0; i < N; i++) 

            Student student = new Student(Reader.next(),Reader.nextInt(),Reader.nextInt());
            Students[student.id_temp] = student;

        


        int M = Reader.nextInt();
        for (int i = 0; i < M; i++) 

            find();
        

    

    public static void find() throws IOException 
        int id_temp = Reader.nextInt();
        Student student = Students[id_temp];

        System.out.println(student.id_stu+" "+student.id_set);
    


    static class Student
        String id_stu;
        int id_temp;
        int id_set;

        public Student()

        public Student(String id_stu, int id_temp, int id_set) 
            this.id_stu = id_stu;
            this.id_temp = id_temp;
            this.id_set = id_set;
        

        @Override
        public String toString() 
            return "Student" +
                    "id_stu='" + id_stu + '\\'' +
                    ", id_temp=" + id_temp +
                    ", id_set=" + id_set +
                    '';
        
    


L1-002 打印沙漏 (20 分)

思路

其实说来也简单,我们主要是要知道,我们那个主要有几层,每一层都是有规律的。

由于这个沙漏是一个等差数列,然后d=2 所以总和 n(1+(n-1)*d +1)/2 = n^2 /2。
不过这块要注意的是,我们这里的话输入的N是两个总和,两个一样的数列之和-1,因为第一个重合了。

(哪怕多了,自动往下取整也没啥)

然后是每一层有几个元素,那个也简单,等差数列呀!

import java.util.Scanner;

public class Main 
    public static void main(String[] args) 
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String ch = sc.next();

        int  h = (int) Math.sqrt((n+1)/2);// 计算高度

        for (int i = 0; i < h; i++)    //打印上半层沙漏
        
            for (int j = 0; j < i; j++)
                System.out.print(" ");
            for (int j = 0; j < 2 * (h - i) - 1; j++)
                System.out.printf("%c", ch.toCharArray()[0]);
            System.out.println();

        

        for (int i = 2; i <= h; i++)    //打印下半层沙漏
        
            for (int j = 0; j < h - i; j++)
                System.out.print(" ");
            for (int j = 0; j < 2 * i - 1; j++)
                System.out.printf("%c", ch.toCharArray()[0]);
            System.out.print("\\n");
        
        System.out.printf("%d", n - 2 * h * h + 1);
    



L1-006 连续因子 (20 分)


这个题目是挺好的,但是我只知道暴力解法

思路

还是暴力的思路,首先是分解约数,这里的话我们从2 开始。然后它要的是递增的,所以 2 是它的第一个约数,所以我就开始猜
sum = 1
从 2 开始 2,3,4,5,6 sum 去乘以这些数字。
当sum<=n 的时候才去,然后我去记录它的这些因子的长度和第一个下标。例如上面记录的就是 2,到 6
由于我们是从小到大去找,所以一开始找到的绝对不是最小长度的。
所以要一直往前找
于是接下来从3开始。

此时由于是找约数,所以我们可以先Math.sqrt(N) 降低一下复杂度。

import java.util.Scanner;

public class Main 
	public static void main(String[] args) 
		long i = 0, j = 0;
		long len = 0, start = 0, sum = 0;
		long n;
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		for (i = 2; i < Math.sqrt(n); i++) 
			sum = 1;
			for (j = i; sum <= n; j++) 
			// j表示当前因子,i表示首因子,sum表示目前乘积,开始暴力枚举
				sum = sum * j;
				if (n % sum == 0 && j - i + 1 > len) 
					start = i;
					len = j - i + 1;
				
			
		
		if (start == 0) 
			start = n;
			len = 1;
		
		System.out.println(len);
		for (int k = 0; k < len - 1; k++) 
			System.out.print(start + k + "*");
		
		System.out.println(start + len - 1);
	


优化的话我想应该可以去 用 KMP 的思想优化,因为它2不行是继续从3开始枚举的。例如630 最小是 4 5 6 7
连续的是 5 6 7
那就是从 2 4 5 67 第一次走 然后记录了2 到 6
第二次 3 4 5 6 7 记录 5 到 7
第三次 再从4 开始。
所以这块可以想想。

以上是关于天梯赛每日打卡01(1-6题解)的主要内容,如果未能解决你的问题,请参考以下文章

天梯赛每日打卡03(13-25题解)

天梯赛每日打卡04(26-40题解)

天梯赛每日打卡05(41-45题解)

题解PTA团体程序设计天梯赛L1-002 打印沙漏 (20 分) Go语言|Golang

PTA 程序设计天梯赛(1~20题)

题解PTA团体程序设计天梯赛L1-004 计算摄氏温度 (5 分) Go语言|Golang