• 华为机试题七


    /*   合唱队
    #include <stdio.h>  
    int main()  
    {  
    	int n;  
    	int i,j;  
    	int a[100];  
    	int f1[100];//存放合唱队的人数(从左向右)  
    	int f2[100];//存放合唱队的人数(从右向左)  
    	int ans = 0;  
    	
    	//cin>>n;  
    	scanf("%d",&n);  
    	for(i=1;i<=n;i++)//第0个位置不存放数据,符合平常的思维习惯。  
            //cin>>a[i];  
            scanf("%d",&a[i]);  
    	
    	for(i=1;i<=n;i++)//由左向右依次遍历   
    	{   
            f1[i] = 1;//至少有一个人符合条件,就是他自己。所以赋初值1.  
            for(j=1;j<i;j++)   
            {  
    			if(a[i]>a[j]&&f1[i]<f1[j]+1) //f1[i]<f1[j]+1很关键的条件,动态问题  
    				f1[i]= f1[j]+1;  
            }          
    	}  
    	
    	for(i=n;i>=1;i--)//由右向左依次遍历  
    	{  
            f2[i] = 1;//至少有一个人符合条件,就是他自己。所以赋初值1.      
            for (j=i+1;j<=n;j++)   
            {         
    			if(a[i]>a[j]&&f2[i]<f2[j]+1)          
    				f2[i]=f2[j]+1;    
            }  
    	}  
    	
    	for(i=1;i<=n;i++)  
            if(ans<f1[i]+f2[i]-1)   
    			ans=f1[i]+f2[i]-1;//最佳解  
    		//cout<<n-ans<<endl;//需要出列的人数  
            printf("%d",n-ans);  
    		return 0;  
    } 
    */
    /*    坐标移动
    #include <iostream>
    using namespace std;
    void main()
    {
    	int x=0,y=0;
    	int i,j,k;
    	char a[100],b[30][5];
    	j=0;
    	k=0;
        gets(a);
    	for (i=0;i<strlen(a);i++)
    	{
            if (a[i] != ';')
            {
               b[j][k] = a[i];
    		   k++;
            } 
            else
            {
    			b[j][k]='';
    			j++;
    			k=0;
            }
    	}
        for (i=0;i<j;i++)
        {
    		k=strlen(b[i]);
    		if (k==2)
    		{
               if (b[i][0]=='A'&& (b[i][1]>='0'&&b[i][1]<='9'))
               {
                   x = x-(b[i][1]-'0');
    
               }
    		   if (b[i][0]=='D'&& (b[i][1]>='0'&&b[i][1]<='9'))
               {
    			   x = x+(b[i][1]-'0');
               }
    		   if (b[i][0]=='W'&& (b[i][1]>='0'&&b[i][1]<='9'))
               {
    			   y = y+(b[i][1]-'0');
               }
    		   if (b[i][0]=='S'&& (b[i][1]>='0'&&b[i][1]<='9'))
               {
    			    y = y-(b[i][1]-'0');
               }
    		} 
    		else if(k==3)
    		{
    			if (b[i][0]=='A'&& (b[i][1]>='0'&&b[i][1]<='9')&&(b[i][2]>='0'&&b[i][2]<='9'))
    			{
    				x = x-((b[i][1]-'0')*10+b[i][2]-'0');
    			}
    			if (b[i][0]=='D'&& (b[i][1]>='0'&&b[i][1]<='9')&&(b[i][2]>='0'&&b[i][2]<='9'))
    			{
    				x = x+((b[i][1]-'0')*10+b[i][2]-'0');
    			}
    			if (b[i][0]=='W'&& (b[i][1]>='0'&&b[i][1]<='9')&&(b[i][2]>='0'&&b[i][2]<='9'))
    			{
    				y = y+((b[i][1]-'0')*10+b[i][2]-'0');
    			}
    			if (b[i][0]=='S'&& (b[i][1]>='0'&&b[i][1]<='9')&&(b[i][2]>='0'&&b[i][2]<='9'))
    			{
    				y = y-((b[i][1]-'0')*10+b[i][2]-'0');
    			}
    		}
        }
    	cout<<x<<","<<y<<endl;
    }
    */
    /*   报数
    #include <iostream>
    using namespace std;
    struct Node
    {
    	int Data;
    	Node *next;
    };
    class list
    {
    public:	
    	Node *head;
    	list() {head = NULL;}
    	void InsertNode(int a);
    };
    void list::InsertNode(int a)
    {
        Node *p,*s,*q;
        s = (Node *)new(Node);
    	s->Data = a;
    	p = head;
    	q = head;
    	if (p == NULL)
    	{
    		head = s;
    		s->next = s;
    	} 
    	else
    	{
    		while (q->next!=p)
    		{
    			q = q->next;
    		}
    		q->next = s;
    		s->next = p;
    	}
    	
    }
    void main()
    {
    	int n,i;
        char s;
    	list slist;
    	Node *p,*q;
        do
    	{
    		scanf("%d",&n);
    		p = NULL;
    		q = NULL;
            slist = list();
    		for (i=1;i<=n;i++)
    		{
    			slist.InsertNode(i);
    		}
    		p = slist.head;
    		while (p!=q)
    		{
    			for (i=1;i<3;i++)
    			{
    				q = p;
                    p = p->next;
    			}
                q->next = p->next;
    			delete p;
    			p = q->next;
    		}
    		cout<<p->Data<<endl;	
    	}
    	while(scanf("%c",&s) != EOF);
    }
    */
    /*  数字基ROOT*/
    /*
    #include <iostream>
    using namespace std;
    int fun1(char *a)
    {
    	int i;
    	int sum = 0;
    	for (i=0;i<strlen(a);i++)
    	{
            if (a[i]>='0'&&a[i]<='9')
            {
    			sum = sum + a[i] -'0';
            }
    		else
    			return -1;
    	}
    	return sum;
    }
    int fun2(int a)
    {
    	if (a<10)	return a;
        int temp;
    	int sum = 0;
    	while (a)
    	{
    		temp = a%10;
    		a=a/10;
    		sum = sum + temp;
    	}
       return sum;
    }
    void main()
    {
        char a[100];
    	int sum;
    	while (gets(a))
    	{
    		sum = fun1(a);
    		while(sum>9)
    		{
    		  sum = fun2(sum);	
    		}
    		cout<<sum<<endl;
    	}	
    }
    */
    /*识别有效IP地址和掩码
    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    static int result[7]={0};   //保存最后结果的数组
    string Chang(string str)    //转换为二进制
    {
    	int num=atoi(str.c_str());
    	string tmp;
    	char tmp1[10]={0};
    	itoa(num,tmp1,2);
    	tmp=string(tmp1);
    	if (tmp.size()<8)
    	{
    		string tmp2(8-tmp.size(),'0');
    		str=tmp2+tmp;
    	}
    	else
    		str=tmp;
    	return str;
    }
    void checkNetSegment(string mask,string ip1)
    {	
    
    	int count1=0,count2=0;
    	int count4=0,count5=0;
    	string str1[4],str3[4];
    	for(int i=0; i<mask.size(); i++)  //掩码的点个数(不连续的点等于3个)
    		if(mask[i]=='.' && mask[i+1]!='.')
    			count1++;
    	for(int i=0; i<ip1.size(); i++)  //ip1的点个数
    		if(ip1[i]=='.' && ip1[i+1]!='.')
    			count2++;
    
    	for(int i=0; i<mask.size(); i++)  //掩码的点个数(所有的点等于3个)
    		if(mask[i]=='.')
    			count4++;
    	for(int i=0; i<ip1.size(); i++)  //ip1的点个数
    		if(ip1[i]=='.')
    			count5++;
    
    	if(count1==count2&&count1==3
    		&& count4==count5&&count4==3)  //如果格式正确
    	{
    		int i=0;                         //ip1先分解为4段
    		int flag1=0;
    		int k=0;
    		while(i<ip1.size())
    		{
    			int tmp=i;
    			while(isdigit(ip1[tmp]))
    				tmp++;
    			str1[k]=ip1.substr(i,tmp-i);
    			k++;
    			i=tmp+1;
    		}
    		i=0;                   //掩码分为4段 		
    		int flag3=0,flagmk=0; 	
    		k=0; 
    		string test;
    		while(i<mask.size()) 	
    		{ 		
    			int tmp=i; 	
    			while(isdigit(mask[tmp])) 		
    				tmp++; 		
    			str3[k]=mask.substr(i,tmp-i); 	
    			k++; 	
    			i=tmp+1; 	
    		} 		
    		for(int i=0; i<4; i++)         //判断每一段的值是否在0-255之间 	
    			if(atoi(str1[i].c_str())<256 &&atoi(str1[i].c_str())>=0) 	
    				flag1++; 	
    
    		for(int i=0; i<4; i++) 	
    			if(atoi(str3[i].c_str())<256 &&atoi(str3[i].c_str())>=0)
    				flag3++; 
    
    		for (int i=0;i<4;i++)        //判掩码是不是1在0前面
    		{
    			string temp=Chang(str3[i]);
    			test+=temp;
    		}
    
    		for (int j=1;j<32-1;j++)
    			if (test[j-1]>test[j] && test[j]<test[j+1])
    			{
    				flagmk=1;
    				break;
    			}
    
    			if(flag1==flag3 &&flag3==4 &&flagmk==0)      //格式正确		
    			{ 
    
    				if (str1[0]>="1" &&str1[0]<="126" )
    					result[0]++;
    				else if (str1[0]>="128" &&str1[0]<="191")
    					result[1]++;
    				else if (str1[0]>="192"&&str1[0]<="223")
    					result[2]++;
    				else if (str1[0]>="224"&&str1[0]<="239")
    					result[3]++;
    				else if (str1[0]>="240"&&str1[0]<="255")
    					result[4]++;
    				else if (str1[0]=="127")
    					result[5]++;
    
    				if (str1[0]=="10"||         //私有IP
    					(str1[0]=="172"&&str1[1]>="16"&&str1[1]<="31")||
    					(str1[0]=="192"&&str1[1]=="168"))
    					result[6]++;
    			}  		
    			else 	
    				result[5]++; 	
    	} 	
    	else                                         //格式不正确 	
    		result[5]++;
    }  
    int main() 
    { 	
    	string s1,ms,ip;
    	while (getline(cin,s1))
    	{
    		int position=s1.find("~",0);
    		ip=s1.substr(0,position);
    		ms=s1.substr(position+1,s1.size()-1);
    		checkNetSegment(ms,ip);
    	}
    	for (int i=0;i<7;i++)
    	{
    		cout<<result[i];
    		if (i==6)
    			cout<<endl;
    		else
    			cout<<" ";
    	}
    	return 0;
    }
    */
    /*mimajiaoyan*/
    #include <iostream>
    using namespace std;
    int LRS(char *a)
    {
    	int leng=strlen(a);
    	int Max=0,count=0;
    	int start1,start2;
    	for(int i=0;i<leng;i++)
    		for(int j=i+1;j<leng;j++)
    		{
    			start1=i;start2=j;
    			while(a[start1]==a[start2] && start1<leng && start2<leng)
    			{
    				count++;
    				start1++;
    				start2++;
    			}
    			if(count>Max)
    				Max=count;
    			count=0;
    		}
    		return Max;
    }
    int check(char *a)
    {
    	int flag[4]={0};
    	int i,sum=0;
    	if (strlen(a) < 8)
    	{
    		return 0;
       }
    	for(i=0;i<strlen(a);i++)
    	{
          if (a[i]>='A'&&a[i]<='Z')
          {
    		  flag[0] = 1;
          } 
          else if(a[i]>='a'&&a[i]<='z')
          {
    		  flag[1] = 1;
          }
    	  else if(a[i]>='0'&&a[i]<='9')
    	  {
    		  flag[2] = 1;
    	  }
    	  else
    		  flag[3] = 1;
    	}
    	for(i=0;i<4;i++)
    	{
          sum = sum + flag[i];
    	}
    	if (sum>=3)
    	{
            if (LRS(a)>2)
                 return 0;
            else
    			 return 1;
    	}  
    	else
    	   return 0;
    }
    void main()
    {
       char a[20];
       while (gets(a))
       {
    	   if (check(a) == 0)
    		   cout<<"NG"<<endl;
    	   else
    		   cout<<"OK"<<endl;  
       }   
    }
    

     中级题和部分初级题

  • 相关阅读:
    一些tcp通讯代码
    使用资源监控工具 glances
    命令行方式运行yii2程序
    php获取apk信息
    Yii2简单纪要
    LuCI探究(转)
    proguard混淆jar文件
    hibernate-search-5.1.1简易使用
    数据库应用-java+sqlserver(六)MyFrame
    数据库应用-java+sqlserver(五)ModifyPassword
  • 原文地址:https://www.cnblogs.com/zlj830/p/4717159.html
Copyright © 2020-2023  润新知