HuaWei-面试题Traing
- 连续输入三个字符串,请按长度为8拆分每个字符串后输出到新的字符串数组; 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
其具体实现代码如下:
#include<iostream>
#include<string>
using namespace std;
void fun(string s)
{
while(s.size()>8)
{
cout<<s.substr(0,8)<<endl;
s = s.substr(8);
}
cout<<s.append(8-s.size(),'0')<<endl;
}
int main()
{
string s1;
string s2;
string s3;
cout<<"请输入字符串s1:"<<endl;
getline(cin,s1);
cout<<"请输入字符串s2:"<<endl;
getline(cin,s2);
cout<<"请输入字符串s3:"<<endl;
getline(cin,s3);
fun(s1);
fun(s2);
fun(s3);
return 0;
}
- 对数组大小为1-100的数组,输入该数组大小范围内的若干个数组元素,输出排序去重后的结果数组元素:
其具体实现代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int arr[100];
int tmp;
int flag = 0;
int count;
cout<<"请输入数组个数"<<endl;
while(cin>>count)
{
cout<<"请依次输入数组"<<endl;
for(int i = 0;i<count;i++)
{
cin>>arr[i];
}
for(int i= 0;i<count-1;i++)
{
for(int j = i+1;j<count-flag;j++)
{
if(arr[i] < arr[j])
{
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
if(arr[i] == arr[j])
{
flag++;
for(int k =j;k<count -1;k++)
{
arr[k]=arr[k+1];
}
j--;
}
}
}
cout<<"请输出排序去重后的数组:" <<endl;
for(int i = 0;i<count-flag;i++)
{
cout<<arr[i]<<endl;
}
}
return 0;
}
- 输入一个正整数,请输出该整数的非质数因子:
其具体实现的代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int num;
cout<<"请输入一个正整数:";
cin>>num;
for(int i= 2;i<num;i++)
{
bool flag = true;
for(int j = 2;j<i;j++)
{
if(i%j == 0)
{
flag = false;
}
}
if(flag)
{
if(num % i == 0)
{
num = num / i;
cout<<i<<" ";
}
}
}
return 0;
}
- 请输入一个正浮点数值,输出该浮点数值的近似整数值。
其具体实现代码如下:
#include<iostream>
using namespace std;
int main()
{
float num;
cout<<"请输入一个正浮点数值:";
cin>>num;
cout<<"请输出该浮点数的近似整数值"<<int(num+0.5)<<endl;;
return 0;
}
- 合并表记录,对数据记录中的表索引相同的value进行合并,即将表索引相同的value进行求和输出;
其具体实现代码如下:
#include<iostream>
using namespace std;
int main()
{
int n,key,value;
cout<<"请输入记录数:";
cin>>n;
cout<<"请输入"<<n<<"个对应的key,value"<<endl;
int arr[n];
for(int i = 0;i<n;i++)
{
cin>>key>>value;
cout<<endl;
arr[key]+=value;
}
cout<<"请输出合并表记录之后的结果:" ;
for(int i =0;i<n;i++)
{
if(arr[i] != 0)
{
cout<<i<<" "<<arr[i]<<endl;
}
}
return 0;
}
- 提取不重复的整数:输入一个Int型整数,并从右往左去掉重复的数字,按照从数字大小从小到大输出:此处用到了set集合
其具体实现代码如下:
#include<iostream>
#include<set>
using namespace std;
int main()
{
int arr[10]={0};
int num;
cout<<"请输入一个int型整数:";
cin>>num;
set<int> s;
set<int>:: const_iterator iter;
while(num)
{
int tmp;
tmp=num%10;
s.insert(tmp);
num = num/10;
}
cout<<"请输出去重后的结果:"<<endl;
if(s.empty())
{
cout<<"set为空。。。"<<endl;
}
for(iter = s.begin();iter!= s.end();iter++)
{
cout<<*iter<<" ";
}
return 0;
}
7.提取不重复的整数:输入一个Int型整数,并从右往左去掉重复的数字输出:此处用到了vector集合
其具体实现的代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int arr[10]={0};
int num;
cout<<"请输入一个int型整数:";
cin>>num;
vector<int> v;
while(num)
{
int tmp;
tmp=num%10;
arr[tmp]++;
if(arr[tmp]>0&&arr[tmp]<2)
{
v.push_back(tmp);
}
num = num/10;
}
cout<<"请输出去重后的结果:"<<endl;
for(int i = 0;i<v.size();i++)
{
cout<<v[i];
}
return 0;
}
8.统计字符个数:输入一个字符串,计算该字符串中不同字符的个数
其具体实现代码如下:
#include<iostream>
#include<set>
using namespace std;
int main()
{
string str;
cout<<"请输入一个字符串:" ;
cin>>str;
set<char> s;
set<int>:: const_iterator iter;
for(int i=0;i<str.length();i++)
{
s.insert(str[i]);
}
if(s.empty())
{
cout<<"set为空。。。"<<endl;
}
cout<<"字符大小: "<<s.size();
return 0;
}
9.整数逆序输出:输入一个正整数,请输出该整数颠倒后逆序输出的结果;
其具体实现的代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int num;
cout<<"请输入一个正整数:" ;
cin>>num;
vector<int> vc;
while(num)
{
int s;
s= num%10;
vc.push_back(s);
num = num/10;
}
cout<<"请输出该正整数逆序输出的结果:" ;
for(int i = 0;i<vc.size();i++)
{
cout<<vc[i];
}
return 0;
}
10.逆序输出英文句子:输入一个英文句子,将该句子包括句子中的单词逆序颠倒后输出;
其具体实现的代码如下:
#include<iostream>
#include<stack>
#include<string>
using namespace std;
int main()
{
string str;
stack<string> ss;
while(cin>>str)
{
ss.push(str);
}
while(!ss.empty())
{
cout<<ss.top();
ss.pop();
if(!ss.empty()) //当Stack中栈顶元素为空时
{
cout<<" ";
}
}
return 0;
}
11.字符串的按照字典序排序的最长路径查找:输入n和字符串,将该n个字符串按照字典序排序后在输出;
其具体实现代码如下:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
int num;
cin>>num;
string str;
vector<string> vc;
vector<string>:: iterator iter;
for(int i=0;i<num;i++)
{
cin>>str;
vc.push_back(str);
}
sort(vc.begin(),vc.end());
for(iter = vc.begin();iter != vc.end();iter++)
{
cout<<*iter<<endl;
}
return 0;
}
12.求一个int型整数在内存总存储时1的数量;
其具体实现代码如下
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n;
cout<<"请输入一个int型整数:"
cin>>n;
int sum = 0;
while(n!=0)
{
n = n&(n-1); //&:n-1用二进制表示为原整数的二进制最右边的1变为0,最右边的1之后的0均变为1,将 n与n-1做&运算,原整数的二进制的个数会减少一个 ,循环该操作,直到原整数二进制内存1的个数为0为止
sum++;
}
cout<<"请输出该int型整数在内存总存储时1的个数:" <<sum;
return 0;
}
13.坐标移动:开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。
输入:
合法坐标为A(或者D或者W或者S) + 数字(两位以内)
坐标之间以;分隔。
下面是一个简单的例子 如:
A10;S20;W10;D30;X;A1A;B10A11;;A10;
结果 (10, -10)
其具体实现代码如下:
#include<iostream>
#include<string>
#include<cstddef>
using namespace std;
int main()
{
string s;
cin>>s;
pair<int,int> pp(0,0);
size_t found = s.find_first_of(';');
int start = 0;
while(found != std::string::npos)
{
string s1 = s.substr(start,found-start);
start = found+1;
found = s.find_first_of(';',found+1);
if(s1.size()>1 && s1.size()<=3)
{
int n = 0;
char c = s1[0];
int invalid = 0;
for(int i = 1;i < s1.size();i++)
{
if(s1[i]>='0' && s1[i]<='9')
{
n = n *10+(s1[i]-'0');
}
else
{
invalid = 1;
break;
}
}
if(invalid == 0)
{
switch(c)
{
case 'A': {pp.first -= n;break; }
case 'D': {pp.first += n;break; }
case 'S': {pp.second -= n;break; }
case 'W': {pp.second += n;break; }
}
}
}
}
cout<<"输出结果为:" <<pp.first<<','<<pp.second<<endl;
return 0;
}
14.统计一个字符串最后单词的长度:输入一个字符串,计算该字符串最后一个单词的长度,单词以空格隔开:
其具体实现代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
cout<<"请输入一行字符串:" ;
getline(cin,str);
int sum = 0;
for(int i=str.size()-1;i>=0;i--)
{
if(str[i]!= ' ')
{
sum++;
}
else
{
break;
}
}
cout<<"该字符串最后一个单词的长度为:" <<sum<<endl;
return 0;
}
15.统计输入的某个字符在一个字符串中相同字符的个数:输入一行字符串和一个字符,计算该字符与字符串中的字符相同的个数;
其具体实现代码如下:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
cout<<"请输入一行字符串:" ;
getline(cin,str);
char c;
cout<<"请输入一个字符:" ;
cin>>c;
int n = 0;
for(int i = 0;i<str.size();i++)
{
if(str[i] == toupper(c) || str[i] == tolower(c))
{
n++;
}
}
cout<<"该输入字符串最含有该字符的个数为:" <<n<<endl;
return 0;
}
16.明明的随机数:输入N个1~1000之间的整数,输出对这n个整数去重排序后的结果(排序从大到小)
其具体实现代码如下:
#include<iostream>
#include<set>
using namespace std;
int main()
{
int N;
while(cin>>N)
{
int array[1000] = {0};
set<int> s;
set<int>::iterator iter;
for(int i = 0;i < N;i ++)
{
cin>>array[i];
s.insert(array[i]);
}
for(iter = s.begin();iter != s.end();iter++)
{
cout<<*iter<<endl;
}
}
return 0;
}
17.提取不重复的整数(无需排序):输入一个Int型整数,并从右往左去掉重复的数字输出;
其具体实现代码如下:
#include<iostream>
#include<array>
using namespace std;
int main()
{
int num;
int arr[10]={0};
int rst = 0;
cin>>num;
while(num)
{
if(arr[num%10] == 0) //arr[num%10] == 0 表示num%10没在计数数组arr中出现过
{
arr[num%10]++; //,当第一次出现num%10,计数数组arr加一
rst = rst * 10+ num%10;
}
num = num /10;
}
cout<<rst<<endl;
return 0;
}
18.编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次;
例如,对于字符串abaca而言,有a、b、c三种不同的字符,因此输出3;
其具体实现代码如下:
#include<iostream>
#include<set>
#include<string>
using namespace std;
int main()
{
string str;
set<char> ss;
while(cin>>str)
{
for(int i = 0;i<str.size();i++)
{
ss.insert(str[i]);
}
}
cout<<ss.size()<<endl;
return 0;
}
19.名字的漂亮数:给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
Input:
整数N,后续N个名字
Output:
每个名称可能的最大漂亮程度
其具体实现的代码如下:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int fun(string str)
{
int count[26]={0};
int value[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26};
int sum = 0;
for(int i = 0;i<str.size();i++)
{
if(str[i] >= 'a' && str[i] <= 'z')
{
count[str[i]-'a']++;
}
else if(str[i] >= 'A' && str[i] <= 'Z')
{
count[str[i]-'A']++;
}
}
sort(count,count+26);
for(int i = 0;i < 26;i++)
{
sum+=count[i] *value[i];
}
return sum;
}
int singacle(int x)
{
string st;
for(int i = 0;i < x;i++)
{
cin>>st;
cout<<fun(st)<<endl;
}
return 0;
}
int main()
{
int n;
while(cin>>n)
{
singacle(n);
}
return 0;
}
20.字符统计:如果统计的个数相同,则按照ASCII码由小到大排序输出 。如果有其他字符,则对这些字符不用进行统计。
实现以下接口:
输入一个字符串,对字符中的各个英文字符,数字,空格进行统计(可反复调用)
按照统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出
清空目前的统计结果,重新统计
调用者会保证:
输入的字符串以‘\0’结尾。
其具体实现代码如下:
#include<iostream>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
struct ST
{
char c;
int n;
};
bool cmp(struct ST a,struct ST b)
{
if(a.n>b.n) return a.c>b.c;
else return a.c<b.c;
}
int main()
{
map<char,int> mp;
map<char,int>::iterator it;
string ss;
vector<ST> vv;
while(cin>>ss)
{
for(int i=0;i<ss.size();i++)
{
it=mp.find(ss[i]);
if(it == mp.end())
{
mp.insert(pair<char,int>(ss[i],1));
}
else
{
mp[ss[i]] += 1;
}
}
for(it = mp.begin();it != mp.end();it++)
{
ST csh;
csh.c = it->first;
csh.n = it->second;
vv.push_back(csh);
}
sort(vv.begin(),vv.end(),cmp);
for(int i= 0;i<vv.size();i++)
{
cout<<vv[i].c;
}
cout<<endl;
}
return 0;
}