字符个数统计

编写一个函数,计算字符串中含有的不同字符的个数。字符在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 ==  3 return 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.0
1.0.0.1~255.0.0.0
192.168.0.2~255.255.255.0
19..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 ==  0 return 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 >  255 return 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。


输入例子:
3
10
81
0
#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 123
5 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值