字符个数统计

来源:互联网 发布:淘宝企业店铺怎么收费 编辑:程序博客网 时间:2024/06/06 01:41

编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。


输入描述:

输入N个字符,字符在ACSII码范围内。



输出描述:

输出范围在(0~127)字符的个数。

#include <iostream>
#include <string.h>
using namespace std;
int main()
{
    char c[500000];
    int s[130]={0};
    cin>>c;
    int len = strlen(c);
    int count = 0;
    for(int i = 0; i <len; ++i )
    {
        if(c[i]>=0 && c[i]<=127)
        s[c[i]]++;
    }
    for(int i = 0; i < 130; ++i){
        if(s[i] > 0)
           count++;
    }
    cout<<count<<endl;
    return 0;
}

句子逆序

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符

#include <iostream>#include <stack>#include <string>using namespace std;//句子逆序  以空格为单位//题目要求是 i am a boy  boy a am i//对于逆序的用栈最合适int main(int argc, char* argv[]){string s;stack<string>  sstack;while(cin>>s){sstack.push(s);}while(sstack.size()!=1){cout<<sstack.top()<<" ";sstack.pop();}cout<<sstack.top()<<endl;return 0;}

字串的连接最长路径查找

题目描述

给定n个字符串,请对n个字符串按照字典序排列。 
输入描述:
输入第一行为一个正整数n(1≤n≤1000),下面n行为n个字符串(字符串长度≤100),字符串中只含有大小写字母。
#include<iostream>
#include<cstring>
 
using namespace std;
int main(){
    char a[1000][1000];
    char temp[1000];
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=0;i<n-1;i++){
        for(int j=i+1;j<n;j++){
            if(strcmp(a[i],a[j])>0){
                strcpy(temp,a[i]);
                strcpy(a[i],a[j]);
                strcpy(a[j],temp);
            }
        }
    }
    for(int i=0;i<n;i++){
        cout<<a[i]<<endl;
    }  
}

求int型正整数在内存中存储时1的个数


题目描述

输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数。


输入描述:

 输入一个整数(int类型)

#include<iostream>
using namespace std;
  
int main()
    {
    int n;
    cin>>n;
    int a[100000]={0};
    int i=0,num=0;
    while(n)
        {
        a[i]=n%2;
        n/=2;
        i++;
    }
    for(int j=0;j<i;j++)
        {
        if(a[j]==1)
            num++;
    }
    cout<<num<<endl;
    return 0;
}

购物单

输入的第 1 行,为两个正整数,用一个空格隔开:N m

(其中 N ( <32000 )表示总钱数, m ( <60 )为希望购买物品的个数。)

从第 2 行到第 m+1 行,第 j 行给出了编号为 j-1 的物品的基本数据,每行有 3 个非负整数 v p q

(其中 v 表示该物品的价格( v<10000 ), p 表示该物品的重要度( 1 5 ), q 表示该物品是主件还是附件。如果 q=0 ,表示该物品为主件,如果 q>0 ,表示该物品为附件, q 是所属主件的编号)
#include <iostream>
#include <memory.h>
 
using namespace std;
 
#define max(a,b) a>b?a:b
int main()
{
    int N; int m;
    cin>>N>>m;
     
    int w[100][3];
    int v[100][3];
    int total[100][5000];
    memset(w, 0, sizeof(w));
    memset(v, 0, sizeof(v));
    memset(total, 0, sizeof(total));
    int _v,_p,_q;
    int num = 1;//num为主件的总数
    for(int i=1;i<=m;i++)
    {
         cin>>_v>>_p>>_q;
         if(_q == 0)
         {
            w[num][0] = _p*_v;
            v[num][0] = _v/10;
            num++;
         }
         else{
             if(w[_q][1]==0){
                w[_q][1] = _v*_p;
                v[_q][1] = _v/10;
             }
             else{
                 w[_q][2] = _p*_v;
                 v[_q][2] = _v/10;
             }
         }
    }
    num-- ;
    for(int i=1;i<=num;i++){
        for(int j=v[i][0];j<=N/10;j++){
            //比较不添加i组物品和添加i组主件
            int tmp = max(total[i-1][j], (total[i-1][ j-v[i][0] ]+w[i][0]));
            //比较有附件1
            if(v[i][1]>0&&j-v[i][0]-v[i][1]>=0)
            {
                tmp = max(tmp, (total[i-1][ j-v[i][0]-v[i][1] ]+v[i][0]+w[i][1]));
            }
            //比较有附件2
            if(v[i][2]>0&&j-v[i][0]-v[i][2]>=0)
            {
                tmp = max(tmp, (total[i-1][ j-v[i][0]-v[i][2] ]+w[i][0]+w[i][2]));
            }
            //比较有附件1和附件2
            if(v[i][2]>0&&v[i][1]>0&&j-v[i][0]-v[i][1]-v[i][2]>=0)
            {
                tmp = max(tmp, (total[i-1][ j-v[i][0]-v[i][1]-v[i][2] ]+w[i][0]+w[i][1]+w[i][2]));
            }
            total[i][j] = tmp;
        }
    }
    cout << total[num][N/10] << endl;
}

坐标移动

开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。

A10;S20;W10;D30;X;A1A;B10A11;;A10;
#include<iostream>
#include<string.h>
using namespace std;
 
int Isright(char str[])
{
    int count = 0;
    if(strlen(str)>0&&strlen(str)<=3)   
        count++;
    if(str[0]=='A'||str[0]=='S'||str[0]=='D'||str[0]=='W')
        count++;
    if((isdigit(str[1])&&(strlen(str)==2))||((strlen(str)>2) && isdigit(str[2]) && isdigit(str[1])))
        count++;
    if(count == 3return 1;
    else return 0;
     
}
 
int main()
{
    char str[10001];
    char solve[1001][1001];   
    while(gets(str))
    {
        int len = strlen(str);
        int count = 0;
        int num = 0;
        for(int i =0;i<len;i++)
        {
            if(str[i]==';')
            {
                solve[count][num] = '\0';
                count++;
                num = 0;
                //cout<<";;"<<count<<endl;              
            }
            else
            {
                //cout<<"zz"<<count<<endl;
                solve[count][num++] = str[i];
            }
            //solve[count][num] = '\0';
            //cout<<solve[i]<<endl;       
        }
        int left = 0;
        int right = 0;
        for(int i =0;i<count;i++)
        {
            //cout<<solve[i]<<endl;
            int num_temp = 0;
            if(Isright(solve[i]))
            {
                //cout<<"s"<<solve[i]<<endl;
                switch(solve[i][0])
                {
                    case 'A':
                    {
                        if(strlen(solve[i])==2)
                        {
                             num_temp = solve[i][1] - '0';                     
                        }  
                        else
                        {
                            num_temp =  (solve[i][1] - '0')*10 + solve[i][2] - '0'
                        }
                        //cout<<num_temp<<endl;
                        left-=num_temp;
                        break;
                    }                     
                    case 'D':
                    {
                        if(strlen(solve[i])==2)
                        {
                             num_temp = solve[i][1] - '0';                     
                        }  
                        else
                        {
                            num_temp =  (solve[i][1] - '0')*10 + solve[i][2] - '0'
                        }
                        //cout<<num_temp<<endl;
                        left+=num_temp; 
                        break;
                    }
                    case 'W':
                    {
                        if(strlen(solve[i])==2)
                        {
                             num_temp = solve[i][1] - '0';                     
                        }  
                        else
                        {
                            num_temp =  (solve[i][1] - '0')*10 + solve[i][2] - '0'
                        }
                        //cout<<num_temp<<endl;
                        right+=num_temp;     
                        break;
                    }
                    case 'S':
                    {
                        if(strlen(solve[i])==2)
                        {
                             num_temp = solve[i][1] - '0';                     
                        }  
                        else
                        {
                            num_temp =  (solve[i][1] - '0')*10 + solve[i][2] - '0'
                        }
                        //cout<<num_temp<<endl;
                        right-=num_temp;     
                        break;
                    }
                    default:break;                       
                }                  
                                
            }       
        }
        cout<<left<<","<<right<<endl;
    }
}

识别有效的IP地址和掩码并进行分类统计

输入描述:

多行字符串。每行一个IP地址和掩码,用~隔开。



输出描述:

统计A、B、C、D、E、错误IP地址或错误掩码、私有IP的个数,之间以空格隔开。


输入例子:
10.70.44.68~255.254.255.01.0.0.1~255.0.0.0192.168.0.2~255.255.255.019..0.~255.255.255.0

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
         
         
using namespace std;
         
         
bool valid(char * data){
    if(data == NULL)return false;
    int len = strlen(data);
    if(len == 0return false;
    for(int i = 0; i < len; i++){
        if(!(data[i] <= '9' && data[i] >= '0')){
            return false;
        }
    }
    return true;
         
}
bool checkAndConvert(char *ip, unsigned int &result){
    int dot = 0;
    for(int i = 0; i < strlen(ip); i++){
        if(ip[i] == '.')dot++;
    }
    if(dot != 3)return false;
    char *data = strtok(ip,".");
    if(!valid(data))return false;
    int tmp = 0;
    result = 0;
    int count = 0;
    while(data){
        tmp = atoi(data);
        if(tmp > 255return false;
        result = result * 256 + tmp ;
        count ++;
        data = strtok(NULL,".");
    }
    if(count != 4)return false;
    return true;
}
int main()
{
    char input[100];
    char ip[50];
    char mask[50];
    int ans[10];
    memset(ans,0,sizeof(ans));
        
    while(gets(input))
    {
        int idx1 = 0;
        int idx2 = 0;
             
        int flag = 0;
             
        for(int i = 0; i < strlen(input); i++){
            if(input[i] == '~'){
                ip[idx1] = '\0';
                flag = 1;
            }
            else if(flag == 0)ip[idx1++] = input[i];
            else if(flag == 1)mask[idx2++] = input[i];
        }
        mask[idx2] = '\0';
        unsigned int ipnum = 0;
        unsigned int masknum = 0;
        if(!checkAndConvert(ip,ipnum) || !checkAndConvert(mask,masknum)){
            ans[5]++;
            continue;
        }
        if(((~masknum + 1) | masknum) != masknum || masknum == 0 || ~masknum == 0){
            ans[5] ++;
            continue;
        }
             
        int head = ipnum >> 24;
        int next = (ipnum - (head << 24)) >> 16;
        if(head <= 126 && head > 0){
            ans[0]++;
        }else if(head <= 191 && head >= 128){
            ans[1]++;
        }else if(head <= 223 && head >= 192){
            ans[2]++;
        }else if(head <= 239 && head >= 224){
            ans[3]++;
        }else if(head <= 255 && head >= 240){
            ans[4]++;
        }
        if(head == 10){
            ans[6]++;
        }
        if(head == 172 && next >= 16 && next <= 31){
            ans[6]++;
        }
        if(head == 192 && next == 168){
            ans[6]++;
        }
            
    }
    cout<<ans[0];
    for(int i=1;i<7;i++)
        cout<<" "<<ans[i];
}
    添加笔记

简单错误记录

题目描述

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。

 

处理: 

E:\V1R2\product\fpgadrive.c   1325

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
typedef struct
{
char name[17];
int line;
int num;
}Errorinfo;
 
int main()
{
char buffer[10240];
int count = 0, hang,i;
Errorinfo record[10240];
while(scanf("%s %d", buffer, &hang) == 2)
{
char *p = strrchr(buffer, '\\');
int len = strlen(p+1);
if(len > 16)
p = p + len - 16;
for(i = 0; i < count; ++i)
{
if(strcmp(record[i].name, p+1) == 0)
if(record[i].line == hang)
{
++record[i].num;
break;
}
}
if(i == count)
{
strcpy(record[count].name, p+1);
record[count].line = hang;
record[count].num = 1;
++count;
}
}
if(count < 8)
i = 0;
else
i = count - 8;
for(; i < count; ++i)
printf("%s %d %d\n",record[i].name, record[i].line, record[i].num);
 
return 0;
}
密码验证合格程序

输入描述:

一组或多组长度超过2的子符串。每组占一行



输出描述:

如果符合要求输出:OK,否则输出NG

#include <stdio.h>
#include <string.h>
    
int main()
{
    char str[1000][1000];
    
    int i,j;
    int n=0;
    
    while(gets(str[n])!=NULL)
        ++n;
    
    for(i=0;i<n;i++)
    {
        int a=0,b=0,c=0,d=0;
    
        for(j=0;str[i][j]!='\0';j++)
        {
            if(str[i][j]>='0'&&str[i][j]<='9')
                a=1;
            else if(str[i][j]>='a'&&str[i][j]<='z')
                b=1;
            else if(str[i][j]>='A'&&str[i][j]<='Z')
                c=1;
            else
                d=1;
        }
    
     if(a+b+c+d<3||j<=8)
          printf("NG\n");
     else
      {
         for(j=0;j<=strlen(str[i])-3;j++)
         {        
             char temp[100];
             char *p1;
             strncpy(temp,&str[i][j],3);         
             temp[3]='\0';   //每次取3个字符组成字串
               
             p1=strstr(str[i],temp); 
             if(p1!=NULL&&p1!=&str[i][j])
             {
                 printf("NG\n");
                 break;
             }
         }
         if(j>strlen(str[i])-3)
            printf("OK\n");
     }
   }
return 0;
}

汽水瓶


输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。



输出描述:

对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。


输入例子:
310810
#include<stdio.h>
  
int main (){
  
    int m;
  
    while(~scanf("%d",&m)&&m!=0) printf("%d\n",m/2);
  
    return 0;
  
}

数据分类处理

30----后续有30整数

3----从小到大排序,第一个R<i>0,但没有满足条件的I<j>,不输出0,而下一个R<i>3

6--- 存在6个包含3I<j> 

0--- 123所在的原序号为0 

123--- 123包含3,满足条件 


输入例子:
15 123 456 786 453 46 7 5 3 665 453456 745 456 786 453 1235 6 3 6 3 0

输出例子:
30 3 6 0 123 3 453 7 3 9 453456 13 453 14 123 6 7 1 456 2 786 4 46 8 665 9 453456 11 456 12 786
# include <stdio.h>
# include <string.h>
void Sort(int R[] , int n)
{
    int i;
    int j;
    int temp;
  
    for(i=0 ; i<n ; i++)
    {
        for(j=i+1 ; j<n ; j++)
        {
            if(R[i] > R[j])
            {
                temp = R[i];
                R[i] = R[j];
                R[j] = temp;
            }
        }
    }
}
bool Fun(int a , int b)
{
    int c1 = 0;
    char c[100];
    char d[100];
    int i = 0;
    int j = 0;
    if(a>=10)
    {
        while(a)
        {
            c[i] = a%10 '0';
            a /= 10;
            i++;
        }
        while(b)
        {
            d[j] = b%10 '0';
            b /= 10;
            j++;
        }
        c[i] = '\0';
        d[j] = '\0';
        if(strstr(d,c))
            return true;
        else
            return false;
    }
    else
    {
        while(b)
        {
            c1 = b%10;
            if(c1 == a)
                return true;
            b /= 10;
        }
        return false;
    }
}
int main(void)
{
    int i , j , k;
    int t;
    int a;
    int cnt;//计数
    int m;//序列I的个数
    int n;//序列R的个数
    int I[65535];
    int R[65535];
    int P[65535];
    int Q[1000];
    while(scanf("%d",&m) != EOF )
    {
        a = 0;
        for(i=0 ; i<m ; i++)
        {
            scanf("%d",&I[i]);
        }
        scanf("%d",&n);
        for(j=0 ; j<n ; j++)
        {
            scanf("%d",&R[j]);
        }
  
        Sort(R,n);
        for(i=0 ; i<n ; i++)
        {
            cnt = 0;
            k = 0;
            while(R[i] == R[i+1] && i<n-1)
                i++;
            for(j=0 ; j<m ; j++)
            {
                if (Fun(R[i] , I[j]))
                {
                    Q[k++] = j;
                    Q[k++] = I[j];
                    cnt++;
                }
            }
            if (cnt > 0)
            {
                P[a] = R[i];
                P[a+1] = cnt;
                for(t=1 ; t<=2*cnt ; t++)
                {
                    P[a+1+t] = Q[t-1];
                
                a = a + 2*cnt + 2;
            }
        }
        printf("%d ",a);
        for(i=0 ; i<a ; i++)
        {
            printf("%d",P[i]);
            if(i == a-1)
                printf("\n");
            else
                printf(" ");
        
    }
    return 0;
}
    添加笔记

【中级】单词倒排

0 0
原创粉丝点击