杭电计算机14年笔试真题

题目一:

如果您曾经尝试在Macintosh上阅读html文档,您就知道如果没有安装网景,那是多么困难。现在,谁能忘记安装HTML浏览器呢?这很简单,因为大多数时候你在MAC电脑上不需要一个,因为有一个以MAC为母语的杂耍阅读器,但是如果你需要一个,你会怎么做?您的任务是编写一个小型的html浏览器。它只需要显示输入文件的内容,只知道html命令(标记)< br >,这是一个linebreak和< hr >,它是一个水平标尺。然后,您应该将所有制表符、空格和换行符视为一个空格,并在一行中显示不超过80个字符的结果文本。输入输入由应该显示的文本组成。该文本由一个或多个空格、制表符或换行符分隔的单词和HTML标记组成。单词是字母、数字和标点符号的序列。例如,“abc,123”是一个词,但是“abc,123”是两个单词,即“abc”和“123”。一个单词总是少于81个字符,并且不包含任何’ < ‘或’ > ‘。所有HTML标签都是< br >或< hr >。输出您应该使用以下规则显示所产生的文本:如果你在输入中读了一个字,结果线的长度不会超过80个字符,打印出来,然后在新的一行上打印出来。如果您在输入中读取< br >,那么就开始一个新行。如果您在输入中读取< hr >,那么就开始一条新行,除非您已经在一行的开头,显示80个字符“-”并开始一个新行(再次)。最后一行以换行符结束。(编写一个浏览器输入输出——对应杭电oj第1088题
思路:
首先,该道题有很多冗余信息,建议去查看一下杭电oj的1088题,直接读原文。
1、逐行读入输入的信息,然后用几个判断句来对这些字符串进行操作。
2、设置一个判断模块儿,要能实现以下这种功能

  • 如果该单词是<br>标签,就对当前显示的文本进行换行处理
  • 如果该单词是<hr>标签,如果该行有数据,先换行然后输出长横线再然后继续换行。如果该行没有数据,直接输出长横线然后直接换行。
  • 如果该单词并不是标签,只是一个普通的单词,那么我们检查一下加上这个单词的长度后是否超过了80,cnt+len+1>80.cnt表示现在该行的长度,len表示单词的长度,+1表示加上单词之间的空格。

3、设置一个输出模块儿,判断一下当前行的长度是否是空的,空的就直接输出,非空则判断+上现在的单词是否超过80,超过则换行。没超过则使用” “+单词的形式输出
4、设置一个cnt变量用来记录正在打印的该行的字符数量,每次遇到标签就更新为0,输出的时候,如果没超过80就cnt=cnt+len+1;

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int main(){
    char S[100];
    int cnt=0;
    while(scanf("%s",S)!=EOF){
        if(strcmp(S,"<br>")==0){//换行保证,该行的长度重新置为0 
            cout<<endl;
            cnt=0;  
            continue ;
        }
        else if(strcmp(S,"<hr>")==0){
            if(cnt)//如果该行有数据 
                cout<<endl<<"--------------------------------------------------------------------------------"<<endl; 
            else//如果该行没有数据 
                 cout<<"--------------------------------------------------------------------------------"<<endl;
            cnt=0;
            continue;
        }
        else{
            int len=strlen(S);
            if(!cnt){//如果该行是空行 
                cnt=len;
                cout<<S;                
            }
            else if(cnt+len+1>80){//如果超过80字符长度,换行。 
                cout<<endl<<S;
                cnt=len; 
            }
            else{//如果没超过80字符                
                cout<<" "<<S;
                cnt+=len+1;//+1是需要把空格算上去 
            }
        }   
    }
    if(cnt)
        cout<<endl;
    return 0;
} 

这种调格式的问题,超级多坑。

题目二:

给定一个仅包含“A”-“Z”的字符串,我们可以使用以下方法对其进行编码:
1。每个包含k个字符的子字符串应该被编码到“kX”,其中“X”是这个子字符串中唯一的字符。
2。如果子字符串的长度为1,则“1”应被忽略。
输入
第一行包含一个整数N(1 <= N <= 100),表示测试用例的数量。下一个N行包含N个字符串。每个字符串只包含“A”-“Z”,长度小于10000。
输出
对于每个测试用例,将编码的字符串输出到一行中。(Encoding —–对应杭电oj的1020题)
思路:
首先要调整一下思路,我们的常规思路是,重新建一个数组,然后对原数组进行一定的处理,把最后的结果存储到新建的数组中,然后输出这个新建的数组。但是其实没必要的,我们只需要把最开始的那个数组,每处理一步,就输出一步,即可。
1、暴力遍历,设置cnt=1,记录当前字符重复的次数。
2、如果暴力的时候,a[i]==a[i+1],那么就让cnt++,记录重复了多少次
3、如果a[i]!=a[i+1],也就是数组前后不相符了,我们就需要输出

  • 如果cnt==1我们就只输出a[i]
  • 如果cnt>=1我们就输出cout<<cnt<<a[i];并用空格把这两个数据分隔开.每次输出结束之后,重置cnt.
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n,cnt;
    cin>>n;
    string temp;
    cnt=1;//记录字符串中字符的重复次数 
    while(n--){
        cin>>temp; 
        for(int i=0;i<temp.length();i++){
            if(temp[i]==temp[i+1]){
                cnt++;//记录重复次数 
            }
            else{
                if(cnt==1)
                    cout<<temp[i];                  
                else{
                    cout<<cnt<<temp[i];
                    cnt=1;                  
                }
            }
        }
        cout<<endl;
    }


    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值