关于《用杂志拼接信件》案例问题的学习与收获

本文介绍了一个编程问题,如何判断给定的信件是否可以由杂志上的字符拼接而成。通过创建字母频率数组,比较信件和杂志中字符的出现次数,解决了实际中字母顺序不考虑的问题。作者强调了分析问题和细致操作的重要性。
摘要由CSDN通过智能技术生成

一、《用杂志拼接信件》

1、案例要求

影视剧中信件大多是从报纸或杂志上的字符剪下来拼接而成的。

杂志和信件均由字符串构成,对于给定的杂志和信件,确定信件是否可以由杂志上的字符构成。

例如杂志为 ab,信件为 aa,则不能构成。杂志为 aab,信件为 aa,则可以构成。

2、输入描述

输入两行字符串,长度均不超过 100。
第一行为杂志字符串,第二行为信件字符串。

3、输出描述

输出一行,若信件可由杂志构成则输出 YES,否则输出 NO。

如:

第一行输入ab,第二行输入aa,则输出NO

4、个人学习前挫折,学习后的分析与思路

1、挫折

首先,观察到输入的杂志与信件之间有包含与被包含关系,则可以利用字符串相关方法.contain( )判断,若信件包含于杂志中,则返回YES,反则返回NO

import java.util.Scanner;

public class 杂志拼接信件 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String a=sc.next();
        String b=sc.next();
        if (a.contains(b)){
            System.out.println("YES");
        }else {
            System.out.println("NO");
        }
    }
}
问题:实际上杂志中的所有数据,字母都是分开零散的,没有考虑到顺序问题

2、学习后的分析与思路

  首先输入的数据都是英文,则可以创建一个数组,26个格子分别存储输入杂志数据的每个英文字母出现的次数,然后统计输入信件字母的出现次数,并与数组中存储的数值相减,若无出现负数则返回YES,反之则返回NO

import java.util.Scanner;

public class 杂志拼接信件 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String a = sc.next();
        String b = sc.next();
        int[] num = new int[26];  //创建26个格子,每个格子存放对应字母出现次数(如第一个格子<0>代表的a出现次数)
        for (int i = 0; i < a.length(); i++) {         //统计输入字符串a中每个字母出现次数存入到数组num中
            num[a.charAt(i) - 'a']++;     //利用charArt方法访问字符串中的每一个字母的值减去字母a的值得到数组num中26个字母对应的位置的下标,并在此单元格加1
        }
        for (int i = 0; i < b.length(); i++) {   //统计输入字符串b中每个字母出现次数在数组num对应字母位置中减去该字母出现次数
            num[b.charAt(i) - 'a']--;        //利用charArt方法访问字符串中的每一个字母的值减去字母a的值得到数组num中26个字母对应的位置的下标,并在此单元格减1
            if (num[b.charAt(i) - 'a'] < 0) {    //如果num数组中出现负数,则返回NO,结束
                System.out.println("NO");
                return;
            }
        }
        System.out.println("YES");     //若一切正常则说明该杂志可以拼接成信件,返回YES
    }
}

3、个人收获

遇到两组数据的操作,不能急于求成,需要仔细分析案例和题目要求,最好是对两组数据一 一对应操作,避免出现差错

这个案例很好的让我熟悉了字符串与数组方法的相关操作,掌握简单的数据拆分方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值