首页 > 试题广场 >

车辆统计者

[编程题]车辆统计者
  • 热度指数:248 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
阿飞是刚入职智加科技的萌新,初来乍到的他了解到几乎每天都有不同型号、不同配置、不同编号的卡车在中美两地运营和测试,于是心血来潮的他想统计公司里每种型号的卡车数量,细心认真的他发现工程团队给每辆车命名时都会按照 ‘车型-编号1-编号2-...-编号k’ 的形式,但是在拉取了公司里所有车辆名称后,阿飞发现存在一些不合法的车辆名称。现在请你帮助他写个程序来整理这些车辆名称,并且统计下合法车辆名称里每种车型对应的卡车数量吧。



输入描述:
输入的第1行包含一个正整数n,表示共有n组数据,0 < n < 1000000
接下来的n行包含一个字符串(长度小于100),表示各个卡车的名称。


输出描述:
按照各个车型的字典序逐行输出车型及该车型的卡车数量
示例1

输入

7
j7-00001
j7-l4e-00002
volvo-wuzhui
paccar-k001dm
navistar-atlas
kenworth-odin
peterbilt-thor

输出

j7 2
kenworth 1
navistar 1
paccar 1
peterbilt 1
volvo 1

说明

按照字典序自小到大依次输出车型及该车型的数量,其中"j7-00001"和"j7-l4e-00002"均属于j7车型
示例2

输入

4
j7-00003
mkz-
paccar-.-
volvo^-^

输出

j7 1

说明

"mkz-" 编号1为空,不纳入统计
"paccar-.-" 编号1不满足仅包含数字和小写字母要求,编号2不满足不为空要求,不纳入统计
"volvo^-^" 不满足车型和编号仅包含数字和小写字母要求,不纳入统计

备注:
只有形如"车型-编号1-编号2-...-编号k"才是可以纳入统计的合法车辆名称,其中"车型"和"编号1~k"应仅包含数字或字母且不为空,0 < k < 50

直接判断

对每条记录按照中划线切割,判断每个item是否都是字母或数字,对合法的车型统计频数,得到 (车型,频数) 二元组序列;最后按照车型字典序输出即可。
import re
from collections import defaultdict

def isValid(line):
    items = line.split('-')
    if len(items) < 2:     # 没有编号的记录过滤掉
        return False
    for item in items:
        if not item.isalnum():     # 判断是否都是字母或数字
            return False
    return True

if __name__ == "__main__":
    n = int(input())
    termFreq = defaultdict(lambda: 0)
    for _ in range(n):
        line = input()
        if isValid(line):
            termFreq[line.split("-")[0]] += 1
    ans = sorted(termFreq.items(), key=lambda x: x[0])
    for pair in ans:
        print(f"{pair[0]} {pair[1]}")

发表于 2022-04-08 15:10:41 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    string s;
    map<string,int> table;
    int n;
    cin>>n;
    while(n--){
        cin>>s;
        int num=0;
        bool valid=true, flag=true;
        string name;
        if(s.back()=='-')
            continue;
        for(int i=0;i<s.size();i++){
            if(s[i]=='-'){
                flag=false;
                num++;
                continue;
            }
            if(!isdigit(s[i])&&((s[i]-'a'<0)||(s[i]-'a'>25))){
                valid=false;
                break;
            }
            if(flag)
                name.push_back(s[i]);
        }
        if(valid&&num>0){
            if(!table.count(name))
                table[name]=1;
            else
                table[name]++;
        }
    }
    for(auto it=table.begin();it!=table.end();it++){
        cout<<it->first<<' '<<it->second<<endl;
    }
}

发表于 2022-07-20 09:47:12 回复(0)
import java.util.*;

public class Main{
    public static String isLegal(String input){//调用该静态方法判定命名是否符合规格,否则返回null;
        String[] strList=input.split("-");//split方法返回分割后的字符串;
        if(strList.length<2)    return null;
        for(String it:strList){
            if(it.matches("^[0-9a-zA-Z]+$")==false){//对字符串内容做判定;
                return null;
            }
        }
        return strList[0];
    }
    public static void main(String[] args){
        HashMap<String,Integer> map=new HashMap<String,Integer>();
        String[] aryStr;//用于储存合法命名字符串的栈;
        int aryPeek=0;//栈顶标识符;
        Scanner in=new Scanner(System.in);
        int N=in.nextInt();
        aryStr=new String[N];
        while(N>0){
            N--;
            String it=Main.isLegal(in.next());
            if(it==null)    continue;
                    //如果命名不符合规则则跳到下一个命名,若符合则返回split数组中的第一个字符串作
                    //为hashmap的key,出现次数作为value;
            if(map.containsKey(it)){
                map.replace(it,map.get(it)+1);//有则修改次数(+1)
            }
            else{
                map.put(it,1);
                aryStr[aryPeek]=it;
                aryPeek++;//无则创建新的键值映射,并在合法命名栈中入栈;
            }
        }
        Arrays.sort(aryStr,0,aryPeek,(a,b)->(a.compareTo(b)));//按字符序对栈中元素进行字符序升序
                                                                                                //排序操作
        for(int i=0;i<aryPeek;i++){
            System.out.println(aryStr[i]+" "+map.get(aryStr[i]));//按排好序的数组输出字符串-次数映射对
        }
        return;
    }
}
发表于 2022-04-13 17:20:59 回复(0)
import re

regex = r"[a-zA-Z0-9]+"
d={}
isLegal=True
carModel=""

n=int(input())
for i in range(n):
    str1=input()
    a=list(str1.split("-"))
    isLegal=True
    for j in a:
        if not re.match(regex,j):
            isLegal=False
            break
    if len(a)==1:
        isLegal=False        
    if isLegal:
        carModel=a[0]
        if carModel not in d:
            d[carModel]=1
        else:
            d[carModel]+=1
d=sorted(d.items(),key=lambda x:x[0])
for i in d:
    print(i[0],i[1],sep=" ")
        
        
        
         


发表于 2022-04-04 10:44:53 回复(0)

热门推荐

通过挑战的用户