华为机试练习(一)

一、字符串最后一个单词长度

1、

# -*- coding:utf-8 -*-  
while True:
    try:
        print u'请输入一串字符串'
        line=raw_input()
        if len(line)==0:
            break
        if len(line)>5000:
            line=line[:5000]
        wordlist=line.split()
        print len(wordlist[-1])
    except:
        break

 注意 raw_input()和line.split()的应用

 注意break 跳出循环,当不输入和输入错的时候就结束整段程序。

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	string s;
	while(getline(cin,s))
	{
		int n=0,flag=1;
		
		for(int i=s.length()-1;i>=0;--i)
		{
			if (flag && s[i]==' ')//去除最后的空格,注意设置标记的作用
			{
				continue;
			}
			else if(s[i]!=' ')
			{
				flag=0;
				++n;
			}
			else
			{
				break;
			}
		}
		cout <<n<<endl;
	}
	return 0;
}

2、

cin:

用法1:最基本,也是最常用的用法,输入一个数字:

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	int a,b;
	cin>>a>>b;
	cout<<a+b<<endl;
}

用法2:接受一个字符串,遇“空格”、“TAB”、“回车”都结束

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	char a[20];
	cin>>a;
	cout<<a<<endl;
}

3、cin.get() 
cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	char a;
	cin.get(a);
	cout<<a<<endl;
}

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	char a;
	a=cin.get();
	cout<<a<<endl;
}

 

两种方法都可以,但是都只接受第一个字符

3.2用法2:cin.get(字符数组名,接收字符数目)用来接收一行字符串,可以接收空格

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	char a[20];
	cin.get(a,8);
	cout<<a<<endl;
}

类似于上面,接收了1个'\0'。

4、

4.1 cin.getline() // 接受一个字符串,可以接收空格并输出

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	char a[20];
	cin.getline(a,8);
	cout<<a<<endl;
}

cin.getline()实际上有三个参数,cin.getline(接受字符串m,接受个数5,结束字符) 

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	char a[20];
	cin.getline(a,8,'5');
	cout<<a<<endl;
}

 

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	char a[20];
	cin.getline(a,8,'9');
	cout<<a<<endl;
}

选择最靠近的那个条件。cin.getline(a,b,c)其后必须要有参数输入,否则报错。

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	char a[3][20];
    for(int i=0;i<3;i++)
        {
    	    cout<<"请输入第"<<i+1<<"个字符串:"<<endl;
			cin.getline(a[i],20); 
        }
    cout<<endl;
    for(int j=0;j<3;j++)
    	{
    		cout<<"输出a["<<j+1<<"]的值:"<<a[j]<<endl; 
    	}
}

数组类型的输入和输出

注意学会格式化的输入和输出。

 5、getline() // 接受一个字符串,可以接收空格并输出,需包含“#include”

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	string str;
	getline(cin,str);
	cout<<str<<endl;
	
}

和cin.getline()类似,但是cin.getline()属于istream流,而getline()属于string流,是不一样的两个函数,注意这个声明的是string ,而非char。

再有,这个将整个行都能输出,而没有‘\0’这种情况。

二、length

#include<iostream> 
#include<string>
using namespace std;
int main()
{
	string a;
	int n;
	getline(cin,a);
	n=a.length(); 
	cout<<n<<endl;
	
}

二、

写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

输入描述:

输入一个有字母和数字以及空格组成的字符串,和一个字符。

输出描述:

输出输入字符串中含有该字符的个数。

1、将想要匹配的字符串分为大小写,按顺序与大写或者小写的匹配

#include<iostream>  
#include<sstream>  
  
using namespace std;  
  
int main()  
{  
    string str;  
    while (getline(cin, str))  
    {  
        char ch;  
        string str2;  
        getline(cin,str2);  
        ch=str2[0];  //匹配的值 
        char ch2 = 0;  //定义0,是为了空格不输入的情况考虑
        if (ch >= 'a'&&ch <= 'z')  
        {  
            ch2 = ch - 32;  //如果大写,增加小写的值,如果小写增加大写的值 
        }  
        if (ch >= 'A'&&ch <= 'Z')  
        {  
            ch2 = ch + 32;  
        }  
        int count = 0;  
        for (int i = 0; i<str.size(); i++)  
        {  
            if (str[i] == ch || str[i] == ch2)  
            {  
                count++;  
            }  
        }  
        cout << count << endl;  
    }  
    return 0;  
}  

#include<iostream>
#include<string>

using namespace std;
int main()
{
	string str;
	while(getline(cin,str))
	{
		char ch,ch2;
		cin>>ch;
		int n=0;
		if(ch>='a'&&ch<='z')
		{
			ch2=ch-32;
		} 
		else if(ch>='A' && ch<='Z')
		{
			ch2=ch+32;
		}
		else
		{
			ch2=ch;
		}	
		for(int i=0;i<str.length();i++)
		{
			if (str[i]==ch || str[i]==ch2)
			{
				n++;
			}
		}
		cout<<n<<endl;
	}
	return 0;
} 

这段程序就实现不了空格字符的个数统计。

2、

#include<iostream>
#include<string>

using namespace std;
int main()
{
	string str;
    
	while(getline(cin,str))
	{
		char ch;
        cin>>ch; 
        char ch2;
		if(ch>='a'&&ch<='z')
		{
			ch2=ch-32;
		} 
		else if(ch>='A' && ch<='Z')
		{
			ch2=ch+32;
		}
        else
        {
            ch2=ch;
        }
        int n=0;
		for(int i=0;i<str.length();i++)
		{
			if (str[i]==ch || str[i]==ch2)
			{
				n++;
			}
		}
		cout<<n<<endl;
	}
    
	return 0;
} 

牛客网的测试不通过,所以以后最好用getline,而别用cin>>给变量赋值。

三、

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。  

1、

//构建1000个数组,输入选出的数的时候就已经在处理数据 
#include <iostream>
using namespace std;
int main() 
{
	int N, n;
	while (cin >> N) //输入的个数 
	{
        int a[1001] = { 0 };
        while (N--) 
		{
            cin >> n;//输入的数组 
            a[n] = 1;//该编号置1 
       }
       for (int i = 0; i < 1001; i++)
       {
            if (a[i])
               cout << i << endl;    
       }
   }
 return 0;
}//

2、set容器

#include<iostream>    
#include<cstring>    
#include<set>    
#include<ctime>    
#define N 999 //三位小数。    
using namespace std;    
    
int main()    
{    
    set<int> s;    //set容器,从小到大排序,不重复
    int i,n,num;    
    while(cin>>n)    
    {    
        s.clear(); //容器清洗   
        for(i=0; i<n; i++)    
        {       
            cin>>num;    
            s.insert(num);//插入数据 
        }    
        set<int>::iterator p;    
        for(p=s.begin(); p!=s.end(); p++)    
        {    
            cout<<*p<<endl;    
        }    //这样会多输出一个空格
    }    
    return 0;    
}     

 

#include<iostream>
#include<set>

using namespace std;

int main()
{
	int loop ;
  	while (cin >> loop) //看题目,set容器 
	{
    	int a[1000], tem, i = 0;
		for (int i = 0; i < loop; i++)
		{
			cin >> a[i];
		}
		set<int> num(a, a + loop);//这个什么鬼?
        for (set<int>::iterator it = num.begin(); it != num.end(); it++)
		{
            cout << *it << endl;
        }
    }
    return 0;
}

3、插入法排序

#include<iostream>  
using namespace std;  

void insert_sort(int a[],int len) //选择法排序 
{  
    int i=0,j=0,temp=0,n;  
    for(i=1;i<len;i++)  
    {  
    	temp =a[i];  
        for(j=i-1;j>=0&&temp<a[j];j--)  
        {  
            a[j+1]=a[j];  
        }  
        a[j+1]=temp;
        
		for(n=0;n<len;n++)
		{
			cout<<a[n]<<" ";
		}  
		cout<<endl;
    }  
}    
   
int main()  
{  
     int a[]={9,8,7,6,5,4,3,2,1} ;
	 cout<<"初始排序:"<<endl;
	 for(int n=0;n<9;n++)
		{
			cout<<a[n]<<" ";
		}  
	 cout<<endl<<endl;
     insert_sort(a,9);
     
	 return 0;  
}  

可以看到,就是从第二个数开始,前面的数先排序,然后,将第三个数插入,依次顺序排开。

4、选择排序

#include<iostream>  
using namespace std;  

void insert_sort(int a[],int len) //选择法排序 
{  
    int i=0,j=0,temp=0,n,smal;  
    for(i=0;i<len-1;i++)  
    {   
        smal=i;//最小值的下标,最小值一直放在这个地方 
        for(j=i+1;(a[j]<a[smal]&&j<len);j++)  
        {  
            temp=a[smal];//中继容器 
            a[smal]=a[j]; 
			a[j]=temp;  
        }  
        
		for(n=0;n<len;n++)
		{
			cout<<a[n]<<" ";
		}  
		cout<<endl;
    }  
}    
   
int main()  
{  
     int a[]={9,8,7,6,5,4,3,2,1} ;
	 cout<<"初始排序:"<<endl;
	 for(int n=0;n<9;n++)
		{
			cout<<a[n]<<" ";
		}  
	 cout<<endl<<endl;
     insert_sort(a,9);
     
	 return 0;  
}  

首先假设第一个是最小值,然后和后面的值一一比较,碰到更小的,交换位置,所以第一个始终都是最小的。继而第二,第三等排下去。

5、冒泡排序

#include<iostream>  
using namespace std;  

void insert_sort(int a[],int len) //冒泡排序 
{  
    int i=0,j=0,temp=0,n,smal;  
    for(i=0;i<len-1;i++)  
    {    
        for(j=0;j<len-1;j++)  
        {  
            if (a[j]>a[j+1])
            {
            	temp=a[j];
            	a[j]=a[j+1];
            	a[j+1]=temp;
            }
        }  
        
		for(n=0;n<len;n++)
		{
			cout<<a[n]<<" ";
		}  
		cout<<endl;
    }  
}    
   
int main()  
{  
     int a[]={9,8,7,6,5,4,3,2,1} ;
	 cout<<"初始排序:"<<endl;
	 for(int n=0;n<9;n++)
		{
			cout<<a[n]<<" ";
		}  
	 cout<<endl<<endl;
     insert_sort(a,9);
     
	 return 0;  
}  

 

从左向右依次两两比较,比较n次后就排好了,但是有个缺点,增加了无效的排序。

 6、去重

#include<iostream>
#include<string>

using namespace std;

int deletrepeat(int a[],int n)
{
	cout<<a[0]<<" ";//输出第一个数 
	int flag=1;//设置标志 
	int b[n];
	b[0]=a[0];//存储去重复后的数组 
	int index=1;//变化后的下标 
	for(int i=1;i<n;i++)//循环比较的次数 
	{
		for(int j=0;j<index;j++)//j新的数组下标
		{
			if(a[i]==b[j])
			{
				flag=0;
			}
		}
		if(flag==1)
		{
			b[index]=a[i];
			cout<<b[index]<<" "; 
			index++;	
		}
		flag=1;
	}
	return index;
}
int main()
{
	int a[]={1,2,3,4,4,5,6,2};
	int n=8;
	deletrepeat(a,n);
	
}  

重复的值,下标改变了,需要重新附一个值给下标。

再有,c++,求数组长度的函数没有,length()是求字符串的。  

 四、

连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; 
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。 

输入描述:

连续输入字符串(输入2次,每个字符串长度小于100)

输出描述:

输出到长度为8的新字符串数组

1、

#include<iostream>
#include<string>
#include<cmath>
using namespace std;
void Add_eight(string a,int n)
{
	int x,y;
	x=(n/8);
	y=((n/8)+1)*8;
	for(int j=0;j<x;j++)
	{
		for(int k=j*8;k<(j*8+8);k++)
		{
			cout<<a[k];
		}
		cout<<endl;
	}
	if((n%8)!=0)
    {
		for(int m=8*x;m<n;m++)
		{
			cout<<a[m];
		}
		for(int q=n;q<8*x+8;q++)
		{
			cout<<0;
		}
    }
	//cout<<endl;//用例之间的换行不要在函数中 
} 
int main()
{
	string a,b;
	getline(cin,a);//输入a,b 
	getline(cin,b);
	int n1,n2;
	n1=a.length();
	Add_eight(a,n1);
	cout<<endl;////注意,用例输出在这 
	n2=b.length(); 
	Add_eight(b,n2);
	
}

 

注意用例之间的换行位置。

 2、

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string a,b,c;
	a="abcdefg";
	b=a.substr(0,3);
	c=a.substr(0);
	cout<<b<<endl;
	cout<<c<<endl;
	
} 

3、c++ append用法

(1)向string的后面加C-string 

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s="hello ";
	const char *c="out here";
	s.append(c);
	cout<<s<<endl;
} 

(2).向string的后面加C-string的一部分 

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s="hello ";
	const char *c="out here";
	s.append(c,3);//将c的前三个字符连接到s中 
	cout<<s<<endl;
} 

(3).向string的后面加string 

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s="hello ";
	string c="wide ";
	string q="world";
	s.append(c);
	s=s+q;//字符串可以相加相连
	cout<<s<<endl;
} 

(4)向string的后面加string的一部分 

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s="hello ";
	string c="wide world";
	s.append(c,5,5);//把字符串s2中从5开始的5个字符连接到当前字符串的结尾 
	cout<<s<<endl;
} 

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s="hello ";
	string c="wide world";
	s.append(c.begin()+5,c.end());//把c的迭代器begin()+5和end()之间的部分连接到当前字符串的结尾当前字符串的结尾 
	cout<<s<<endl;
} 

(5).向string后面加多个字符 

#include<iostream>
#include<string>
using namespace std;
int main()
{
	string s="hello ";
	s.append(4,'6');
	cout<<s<<endl;
} 

4、

#include <iostream>
using namespace std;

int main()
{
    string str;
    while(getline(cin,str))
	{
        while(str.size()>8)
		{
            cout << str.substr(0,8) <<endl;
            str=str.substr(8);
        }
        cout << str.append(8-str.size(),'0') << endl; //不够8位的补0
    }
}

 五、

题目描述

写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(多组同时输入 )

输入描述:

输入一个十六进制的数值字符串。

输出描述:

输出该数值的十进制字符串。

1、它由0-9,A-F组成,字母不区分大小写。

#include <iostream>
using namespace std;

int main()
{
 int a;
 while(cin>>hex>>a){
 cout<<a<<endl;
 }
}

2、

#include <iostream>  
#include <iomanip>  
using namespace std;  
int main()  
{  
   int n;  
  
   cout << "Enter a decimal number: ";  
   cin >> n;  
  
   cout << n << " in hexadecimal is: "   
        << hex << n << endl  //十六进制 
        << dec << n << " in octal is: "   
        << oct << n << endl //八进制 
        << setbase( 10 ) << n << " in decimal is: "   
        << n << endl;  //十进制 
  
   return 0;  
}  

3、输入和输出同时存在的情况

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n;
	cin>>hex>>n;
	cout<<n<<"的十六进制:"<<hex<<n;
	return 0;
	
}

输入的是个十六进制数,但是保存的n却是十进制,还需要hex才能输出十六进制。

#include<iostream>
#include<string>
using namespace std;
int main()
{
	int n;
	cin>>oct>>n;
	cout<<n<<"的十六进制:"<<hex<<n;
	return 0;
	
}

3、传统一个一个读取的方式

#include<iostream>
#include<string>
using namespace std;
int main()
{
	char *sp=new char[10];
	while(cin>>sp)
	{
		int n;
		int num;
		int result=0;
		n=strlen(sp);
		for(int i=2;i<n;i++)
		{
			switch(sp[i])
			{
				case 'A':
				case 'a'://大于10的处理 
					num=10;break;
				case 'B':
				case 'b':
					num=11;break;
				case 'C':
				case 'c':
					num=12;break;
				case 'D': 
				case 'd':
					num=13;break;
				case 'E':
				case 'e':
					num=14;break;
				case 'F':
				case 'f':
					num=15;break;
				default:
				    if(sp[i]>='0'&&sp[i]<='9')
					{
						num=sp[i]-'0';
					} 
					
			}
			result=result*16+num;
		}
		cout<<result<<endl;
		result=0;
	}
	 return 0;	
}

注意case 的情况,只能分开来识别,不能出现case(a||b)这种情况。因为后面给的是逻辑值,只能0或者1。  

4、字符串长度求法

C/C++ strlen(str)和str.length()和str.size()都可以求字符串长度。

其中str.length()和str.size()是用于求string类对象的成员函数

strlen(str)是用于求字符数组的长度,其参数是char*。

#include <string>

#include <iostream>
using namespace std;

int main()
{
	string name="babababa";
	cout<<name.length()<<endl;
	cout<<name.size()<<endl;
	
	char mail[100]="haha";
	cout<<strlen(mail)<<endl;
	
	char *psd;
	psd="lalala";
	cout<<strlen(psd)<<endl;
	
	return 0;
}

 

  

 

  

posted on 2018-03-28 22:49  箬笠蓑衣  阅读(368)  评论(0编辑  收藏  举报