【PTA】题目

记录一些自己不太熟或者不会的题目和题型,以供后面参考和回顾

技巧

骗分

输出只有两种情况的(或者多种)
在这里插入图片描述
直接输出 YES 或者 NO 有可能有几分的

分数

N个数求和

【参考:pta基础题目集:N个数求和 (20 分)_千与千寻.i的博客-CSDN博客

每输入一个分数,将这个分数与之前的和相加,然后化简

推导过程

x y = x y + a b \frac{x}{y}=\frac{x}{y} + \frac{a}{b} yx=yx+ba 分母通分

a b = a ∗ y b ∗ y \frac{a}{b}=\frac{a*y}{b*y} ba=byay

因为都*b,然后

x y = b ∗ x b ∗ y \frac{x}{y}=\frac{b*x}{b*y} yx=bybx
最后 x y = b ∗ x b ∗ y + a ∗ y b ∗ y \frac{x}{y}=\frac{b*x}{b*y} + \frac{a*y}{b*y} yx=bybx+byay

x = b * x + a * y;
y = b * y;

最后除以最小公约数g约分即可

import java.util.*;

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

        int x = 0, y = 1;
        int a, b;
//        char c;
        while (n > 0) {
            n--;
            String s = sc.next();
            int index = s.indexOf('/');

            a = Integer.parseInt(s.substring(0, index)); // 分子
//                c = s.charAt(index);
            b = Integer.parseInt(s.substring(index + 1));// 分母

            x = b * x + a * y;
            y = b * y;
            int g = gcd(x, y); // 最小公约数
            x = x / g;
            y = y / g;
        }

        if (x % y == 0) { // 有整数部分,没有分数部分
            System.out.println(x / y);
            return;
        }
        if (x > y) { // 有整数部分,有分数部分
            System.out.printf("%d %d/%d", x / y, x % y, y);
            return;
        }
        // 无整数部分,有分数部分
        System.out.printf("%d/%d", x, y);


    }

    static int gcd(int a, int b) {
        if (b == 0) return a;
        return gcd(b, a % b);
    }


}

集合相似度 (交集,并集)

【参考:PTA----集合相似度 _0k-ok的博客-CSDN博客

【参考:Set 求交集、并集、差集_String NUll的博客-CSDN博客

import java.util.*;


public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        HashSet[] arr = new HashSet[n + 1];

        for (int i = 1; i <= n; i++) {
            int m = sc.nextInt();
            arr[i] = new HashSet<>();
            for (int j = 0; j < m; j++) {
                int temp = sc.nextInt();
                arr[i].add(temp);
            }
        }
        int k = sc.nextInt();
        int h=k;
        double[] ss = new double[k + 1];
        int i = 1;
        while (k > 0) {
            k--;
            int x = sc.nextInt();
            int y = sc.nextInt();

            // 交集
            HashSet<Integer> set1 = new HashSet<>();
            set1.addAll(arr[x]);
            set1.retainAll(arr[y]); // 保留list中在指定集合中也存在的那些元素 即保留相同部分

            // 并集
            HashSet<Integer> set2 = new HashSet<>();
            set2.addAll(arr[x]);
            set2.addAll(arr[y]);

            ss[i] = set1.size() * 100.0 / set2.size();
            i++;

        }
        for (int j = 1; j <=h ; j++) {
            System.out.printf("%2.2f%%\n", ss[j]);// 后面两个百分号是为了输出%,必须要用两个输出
        }


    }


}

字符串

最长对称子串

【参考:PTA 团体程序设计天梯赛-练习集 L2-008 最长对称子串 _镇长1998的博客-CSDN博客
思路: 枚举对称串的中心!!!!
而一个字符串的中心有2种情况:
单个字符(整个字符串的长度是奇数),
两个字符(整个字符串的长度是偶数)

【参考:最长对称子串_Xuhx&的博客-CSDN博客

和这道题一样【参考:5. 最长回文子串 - 力扣(LeetCode)

import java.util.*;


public class Main {


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();

        int res = 0;

        int len = s.length();

        // 对称轴是第i个字符 最长对称子串的长度是奇数
        for (int i = 0; i < len; i++) {
            int sLen  = 1; // 从1开始,奇数最少为1 即对称子串长度为1
            int x = i - 1;
            int y = i + 1;
            // 先判断下标是否合法 再判断相等 比较方便
            while ( x >= 0 && y < len && s.charAt(x) == s.charAt(y) ) {
                x--;
                y++;
                sLen+=2;
            }
            if (sLen > res) {
                res=sLen;
            }
        }
        // 对称轴是第i,i+1个字符 最长对称子串的长度是偶数
        for (int i = 0; i < len; i++) {
            int sLen = 0; // 从0开始,偶数最少为0 即没有对称子串
            int x = i;
            int y = i + 1;
            while (x >= 0 && y < len && s.charAt(x) == s.charAt(y)) {
                x--;
                y++;
                sLen+=2;
            }
            if (sLen > res) {
                res=sLen;
            }
        }
        System.out.println(res);


    }


}

模拟

币值转换

来源:7-23 币值转换 (20分)-java_gwgw0621的博客-CSDN博客

还是没有理解 处理特殊情况0,重复的0,末尾的0,和重复的万后面的0这一块

import java.util.Scanner;

public class demo4 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.nextLine();
        // 首先排除输入为0的情况
        if (s.equals("0")) {
            System.out.println("a");
            System.exit(0);// 退出程序
        }
        // 输入是按照从高到低,但是我们处理需要从个位到亿位.
        // 将输入的字符串反转
        StringBuffer sb = new StringBuffer(s);
        sb.reverse();
        s = new String(sb);
        // 将字符串转换为数组
        char[] ch = s.toCharArray();

        String str = "";// 最终的字符串
        int start = 0;// 标记是末尾的0或者万后面的0
        int f = 0;// 标记重复的0
        for (int i = 0; i < ch.length; i++) {
            // a-z:97-122,A-Z:65-90,0-9:48-57
            char a = (char) (ch[i] + 49);// 取出字符数组,并将其转化为a~j 49??
            String s1 = "";// 存放大写的字母
            switch (i) {
                case 1:
                case 5:
                    s1 = "S"; // 十
                    break;
                case 2:
                case 6:
                    s1 = "B"; // 百
                    break;
                case 3:
                case 7:
                    s1 = "Q"; // 千
                    break;
                case 4:
                    s1 = "W"; // 万
                    break;
                case 8:
                    s1 = "Y"; // 亿
                    break;
            }
            if (a == 'a') {// 判断等于0的情况  ’a':0
                if (i == 4) {// 判断是不是万位
                    str += "W";// 万位为0时需要输出W,
                    start = 0;// 并且万位后面的0也需要输出 // 例 300210 三十万零两百一十
                    f = 0;
                }
                if (f == 0 && start == 1) { // 例 302010 三十万两千零一十  需要输出这个零
                    //当这个0不重复,并且不是末尾的0时,只需要输出一个0,并将重复0标志打开
                    //只有输出非0的位时才会关闭这个标志
                    str += "a";
                    f = 1;
                }
            } else {//处理不为0的情况
                start = 1;//只要输出了不为0的数字,就会关闭重复0标志f,和打开末尾0标志start
                f = 0;
                str = str + s1 + a;// 这里是逆序存放
            }
        }
        //最后再将字符串反转回来输出
        sb = new StringBuffer(str);
        sb.reverse();
        System.out.println(sb);
    }
}

300210
dSWacBbS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值