「PAT乙级真题解析」Basic Level 1108 String复读机 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设要求将给定的字符串按照"String"的顺序输出, 并且忽略"String"之外的字符。 同时说明了"String"中6个字符出现的频次不保证相同, 输出时若某种字符已输出完毕, 则跳过该字符. 所以, 我们要做的是统计"String"中各个字符在给定的字符串中出现的次数作为要输出的个数, 然后按照"String"的顺序循环检查每一个字符当前的剩余个数, 如果不等于0, 则输出并将次数减一, 直到这6个字符的剩余个数都为0为止。

#算法#pat考试#数据结构#c语言#需求分析

Table of Contents

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT (Basic Level) Practice 1108 String复读机

问题分析

  • 题设要求将给定的字符串按照"String"的顺序输出, 并且忽略"String"之外的字符。
  • 同时说明了"String"中6个字符出现的频次不保证相同, 输出时若某种字符已输出完毕, 则跳过该字符.
  • 所以, 我们要做的是统计"String"中各个字符在给定的字符串中出现的次数作为要输出的个数,
  • 然后按照"String"的顺序循环检查每一个字符当前的剩余个数, 如果不等于0, 则输出并将次数减一,
  • 直到这6个字符的剩余个数都为0为止。

完整描述步骤

  1. 获取输入: 给定字符串
  2. 初始化统计器:
    • 各个字符出现的次数 = { 'S': 0, 't': 0, 'r': 0, 'i': 0, 'n': 0, 'g': 0, }
  3. 对于给定字符串的每一个字符:
    • 如果当前字符是"String"中的某一个:
      • 将计数器中当前字符串的频次 + 1
  4. 初始化标记位记录器:
    • 当前循环进行过输出
  5. 循环执行以下操作:
    • 设置 当前循环进行过输出 = False
    • 对于"String"中的各个字符:
      • 检查字符在计数器中的值:
        • 如果值大于1:
          • 输出该字符
          • 将计数器的对应值 - 1
          • 当前循环进行过输出 = True
    • 如果 当前循环进行过输出 = False: (说明全部的字符计数器值都等于0)
      • 跳出循环

伪代码描述

  1. get input: content
  2. init recorder:
    • counter = {0}
  3. for char in content:
    • if char in "String":
      • counter[char] ++;
  4. init flag: output
  5. while True:
    • output = False
    • for char in "String":
      • if counter[char] > 0:
        • print(char);
        • counter[char] --;
        • output = True
    • if output == False:
      • break;

完整提交代码

/*
# 问题分析
题设要求将给定的字符串按照"String"的顺序输出, 并且忽略"String"之外的字符。
同时说明了"String"中6个字符出现的频次不保证相同, 输出时若某种字符已输出完毕, 则跳过该字符.
所以, 我们要做的是统计"String"中各个字符在给定的字符串中出现的次数作为要输出的个数,
然后按照"String"的顺序循环检查每一个字符当前的剩余个数, 如果不等于0, 则输出并将次数减一,
直到这6个字符的剩余个数都为0为止。
 
# 完整描述步骤
1. 获取输入: 给定字符串
2. 初始化统计器:
    - 各个字符出现的次数 = {
        'S': 0,
        't': 0,
        'r': 0,
        'i': 0,
        'n': 0,
        'g': 0,
    }
3. 对于给定字符串的每一个字符:
    - 如果当前字符是"String"中的某一个:
        - 将计数器中当前字符串的频次 + 1
4. 初始化标记位记录器:
    - 当前循环进行过输出
5. 循环执行以下操作:
    - 设置 当前循环进行过输出 = False
    - 对于"String"中的各个字符:
        - 检查字符在计数器中的值:
            - 如果值大于1:
                - 输出该字符
                - 将计数器的对应值 - 1
                - 当前循环进行过输出 = True
    - 如果 当前循环进行过输出 = False: (说明全部的字符计数器值都等于0)
        - 跳出循环
 
# 伪代码描述
1. get input: content
2. init recorder:
    - counter = {0}
3. for char in content:
    - if char in "String":
        - counter[char] ++;
4. init flag: output
5. while True:
    - output = False
    - for char in "String":
        - if counter[char] > 0:
            - print(char);
            - counter[char] --;
            - output = True
    - if output == False:
        - break;
 
*/
 
 
# include<stdio.h>
 
int main(){
    int counter[256] = {0};
    
    char content[10010];
    scanf("%s", content);
    for (int i = 0; content[i]; i++){
        if (content[i] == 'S' || 
            content[i] == 't' || 
            content[i] == 'r' || 
            content[i] == 'i' || 
            content[i] == 'n' || 
            content[i] == 'g'){
            counter[content[i]]++;
        }
    }
 
    char target[7] = "String";
    while (1){
        int output = 0;
        for (int i = 0; i < 6; i++){
            if (counter[target[i]] > 0){
                printf("%c", target[i]);
                counter[target[i]]--;
                output = 1;
            }
        }
        
        if (output == 0) break;
    }
    return 0;
}
「PAT乙级真题解析」Basic Level 1108 String复读机 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果