根据给定的信息,本文将详细解释两个编程问题的解决方案,分别是NOIP2007中的“count统计数字”和“expand字符串的展开”。这两个题目分别涉及数组处理与字符串操作。 ### 第一题:Count统计数字 #### 题目描述 输入一个数`n`(`n <= 200000`)以及`n`个自然数(每个数都不超过1.5 * 10^9),请统计这些自然数各自出现的次数,并按照数字从小到大的顺序输出。输入数据保证不相同的数不超过10000个。 #### 示例 **输入示例** ``` 8 2 4 2 4 5 100 2 100 ``` **输出示例** ``` 2 3 4 2 5 1 100 2 ``` #### 解题思路 1. **初始化变量**:创建一个数组`a`用于存储输入的自然数,以及一个数组`cnt`用于记录每个数出现的次数。 2. **读取输入**:读取`n`以及`n`个自然数,并将其存储在数组`a`中。 3. **统计次数**:遍历数组`a`,对于每个数,更新数组`cnt`中对应的计数值。 4. **输出结果**:遍历数组`cnt`,对于非零计数的元素,按照数字顺序输出数字及其出现次数。 #### 参考代码 ```pascal program count(input, output); var n: integer; a: array [1..200000] of integer; // 存储输入的自然数 cnt: array [1..1500000000] of integer; // 记录每个数出现的次数 i: integer; begin assign(input, 'count.in'); assign(output, 'count.out'); reset(input); rewrite(output); readln(n); for i := 1 to n do begin readln(a[i]); inc(cnt[a[i]]); end; for i := 1 to 1500000000 do if cnt[i] > 0 then writeln(i, ' ', cnt[i]); close(input); close(output); end. ``` ### 第二题:Expand字符串的展开 #### 题目描述 可以使用减号来表示连续的字母或数字,例如`a-d`表示`abcd`。给定三个参数`p1`, `p2`, `p3`以及一个仅由数字、小写字母和减号组成的字符串(长度不超过100),请按参数展开此字符串。 **参数意义**: - `p1=1` -> 所有填充的字母都写成小写; - `p1=2` -> 所有填充的字母都写成大写; - `p1=3` -> 所有填充的字母和数字都用星号代替; - `p2=k` -> 同一个填充字符连续写`k`遍; - `p3=1` -> 顺序填充; - `p3=2` -> 逆序填充。 如果减号两边的字符一个是数字一个是字母,或者减号右边的ASCII码小于左边的,则该位置不变。 #### 示例 **输入示例1** ``` 1 2 1 abcs-w1234-9s-4zz ``` **输出示例1** ``` abcsttuuvvw1234556677889s-4zz ``` **输入示例2** ``` 2 3 2 a-d-d ``` **输出示例2** ``` aCCCBBBd-d ``` **输入示例3** ``` 3 4 2 di-jkstra2-6 ``` **输出示例3** ``` dijkstra2************6 ``` #### 解题思路 1. **解析参数**:首先读取参数`p1`, `p2`, `p3`。 2. **读取字符串**:读取输入字符串。 3. **处理字符串**:遍历字符串,当遇到减号时,确定起始字符和结束字符,并根据参数进行相应的填充操作。 4. **输出结果**:输出处理后的字符串。 #### 参考代码 ```pascal program expand(input, output); var p1, p2, p3: integer; s: string; i, start, endChar, k: integer; fillChar: char; procedure fillString(var result: string; ch: char; times: integer); begin for i := 1 to times do result := result + ch; end; begin assign(input, 'expand.in'); assign(output, 'expand.out'); reset(input); rewrite(output); readln(p1, p2, p3); readln(s); for i := 1 to Length(s) do begin if s[i] = '-' then begin if (i > 1) and (i < Length(s)) then begin start := Ord(s[i - 1]); endChar := Ord(s[i + 1]); if ((start <= endChar) and (start >= 'a') and (endChar <= 'z')) or ((start <= endChar) and (start >= '0') and (endChar <= '9')) then begin for k := start to endChar do begin if p1 = 1 then fillChar := Chr(k) else if p1 = 2 then fillChar := Chr(k - 32) else fillChar := '*'; fillString(s, fillChar, p2); end; end; end; end; writeln(s); close(input); close(output); end. ``` 以上两个题目分别为统计数字出现次数和字符串展开的问题,通过合理的数据结构设计和逻辑处理,能够高效地解决问题。
- 粉丝: 0
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于C++的简易操作系统模拟器.zip
- (源码)基于ROS和PCL的激光与UWB定位仿真系统.zip
- (源码)基于Arduino的iBeacon发送系统.zip
- (源码)基于C语言和汇编语言的简单操作系统内核.zip
- (源码)基于Spring Boot框架的AntOA后台管理系统.zip
- (源码)基于Arduino的红外遥控和灯光控制系统.zip
- (源码)基于STM32的简易音乐键盘系统.zip
- (源码)基于Spring Boot和Vue的管理系统.zip
- (源码)基于Spring Boot框架的报表管理系统.zip
- (源码)基于树莓派和TensorFlow Lite的智能厨具环境监测系统.zip