华为oj
1 计算字符串最后一个单词的长度,单词以空格隔开
#include<iostream>
#include<string>
using namespace std;
int main()
{
int n=0, flag=1;
string str;
while(getline(cin,str))//cin>>str会报错
{
for(int i=str.length()-1; i>=0; i--)
{
if(flag && str[i]==' ')
{
continue;
}
else if(str[i]!=' ')
{
flag=0;
n++;
}
else
break;
}
cout<<n<<endl;
}
return 0;
}
2
写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string input;
char target;
char target1;//考虑英文字母大小写情况
int count=0;
getline(cin,input);
cin>>target;
if(target>=65 && target<=90)
target1 = target+32; //A-Z:65-90
else if(target>=97 && target<=122)
target1 = target-32; //a-z:97-122
for(int i=0; i<input.length(); i++)
{
if(input[i]==target || input[i]==target1)
count++;
}
cout<<count<<endl;
return 0;
}
3 •连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;
•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。
输入例子:
abc 123456789
输出例子:
abc00000 12345678 90000000
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
string str1;
string str2;
while(cin>>str1)
{
cin>>str2;
vector<string> temp;
temp.push_back(str1);
temp.push_back(str2);
for(int i=0; i<2; i++)
{
string t=temp[i];
int n1=t.size()/8;
int n2=t.size()%8;
for(int j=0; j<8-n2 && n2>0; j++)
{
t=t+'0';
}
if(n2>0)
n1++;
for(int k=0; k<n1; k++)
{
cout<< t.substr(8*k,8) << endl;
}
}
}
return 0;
}
4
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。(
多组同时输入
)
#include<iostream>
using namespace std;
int main()
{
int a;
//cin>>oct>>b; 输入八进制转换成十进制
while(cin>>hex>>a)//输入十六进制转换成十进制
cout<<a<<endl;
return 0;
}
5 功能:输入一个正整数,按照从小到大的顺序输出它的所有质数的因子(如180的质数因子为2 2 3 3 5 )
#include<iostream>
using namespace std;
int main()
{
int input;
while(cin>>input)
{
while(input!=1)
{
for(int i=2; i<=input; i++)
{
if(input%i==0)
{
input /=i;
cout<< i << ' ' ;
break;//退出本次循环操作
}
}
}
}
return 0;
}
6 数据表记录包含表索引和数值,请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。
输入描述:
先输入键值对的个数;然后输入成对的index和value值,以空格隔开
输出描述: 输出合并后的键值对(多行)
输入例子:
4 0 1 0 2 1 2 3 4
输出例子:
0 3 1 2 3 4
#include<iostream>
#include<map>
using namespace std;
int main()
{
int n;//输入键值对的个数
while(cin>>n)
{
map<int,int> m;//存储索引index,和值value
while(n--)
{
int key, value;
cin>>key>>value;
if(!m[key])//对应索引值默认为0;若存在则相加
m[key] = value;
else
m[key] += value;
}
map<int,int>::iterator it;
for(it=m.begin(); it!=m.end(); it++)
cout<<it->first<<" "<<it->second<<endl;
}
return 0;
}
7
输入一个int型整数,按照从右向左的阅读顺序,返回一个不含重复数字的新的整数。
输入描述:输入一个int型整数
输出描述:按照从右向左的阅读顺序,返回一个不含重复数字的新的整数
输入例子:9876673
输出例子:37689
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int input;//存储输入数据
int arr[10]={0};//含10个元素的数组,存储0-9
vector<int> a;//存储输出新整数
while(cin>>input)
{
while(input)
{ int ar=input%10;
input /=10;
if(arr[ar]==0)//若之前无重复数字,存于输出a中
{
arr[ar]++; //一旦出现过就标识不为0
a.push_back(ar);
}
}
vector<int>:: iterator it;
for(it=a.begin(); it!=a.end(); it++)//先入先出
cout<<*it;
cout<<endl;
}
return 0;
}
8
编写一个函数,计算字符串中含有的不同字符的个数。字符在ACSII码范围内(0~127)。不在范围内的不作统计。
输入描述:输入N个字符,字符在ACSII码范围内(0~127)。
输出描述:输出字符的个数。
输入例子:abc
输出例子:
3
#include<iostream>
#include<string>
using namespace std;
int main()
{
int str[128]={0};//标记每个位置字符是否有重复出现
string input;//输入字符串
int count=0;//计数
while(cin>>input)
{
for(int i=0; i<input.length(); i++)
{
if(str[input[i]]==0)
{
count++;
str[input[i]]++;
}
}
cout<<count<<endl;
}
return 0;
}
9
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
输入描述:输入一个int整数
输出描述:将这个整数以字符串的形式逆序输出
输入例子:1516000
输出例子:0006151
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int input;//输入整数
vector<int> output;//输出
while(cin>>input)
{
while(input)
{
int ar=input%10;
input /=10;
output.push_back(ar);
}
vector<int>::iterator it;
for(it=output.begin(); it!=output.end(); it++)
cout<<*it;
cout<<endl;
}
return 0;
}
10 重点---关于字符串处理
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”
所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
public String reverse(String sentence);
输入描述:将一个英文语句以单词为单位逆序排放。
输出描述:得到逆序的句子
输入例子:I am a boy
输出例子:boy a am I
#include<iostream>
#include<string>
#include<vector>
using namespace std;
/*定义分割函数,返回字符串数组*/
vector<string> split(string str, string pattern)//输入字符串和分隔符
{
vector<string> ret;//存储返回值
if (pattern.empty())//分隔符为空,则直接返回
return ret;
int start = 0, index = str.find_first_of(pattern, 0);//找到str中从0位置开始第一个出现pattern的位置
while (index != string::npos)//string::npos验证索引返回是否成功--Y
{
if (start != index)
ret.push_back(str.substr(start, index - start));//输出从start开始,长度为index - start的字符串
start = index + 1;
index = str.find_first_of(pattern, start);
}
if (!str.substr(start).empty())
ret.push_back(str.substr(start));
return ret;
}
int main()
{
string str;
getline(cin , str);
vector<string> temp;
string pattern = " ";
temp = split(str, pattern);
for (int i = temp.size() - 1; i>0; i--)
cout << temp[i] << " ";
cout << temp[0] << endl;
return 0;
}
11 int型整数的二进制中有多少个1?
<pre name="code" class="cpp">#include<iostream>
using namespace std;
int main()
{
int a;
while(cin>>a)
{
int count=0;
while(a)
{
a &=a-1;//判1个数;a |=a-1 判0个数
count++;
}
cout<<count<<endl;
}
return 0;
}
1 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
class Solution {
public:
bool Find(vector<vector<int> > array,int target)
{
int rowCount=array.size();
int colCount=array[0].size();
int i=rowCount-1;//从左下角开始,较大则向上,较小则向下!
int j=0;
while(i>=0&&j<colCount)
{
if(array[i][j]>target)
{
i--;
continue;
}
else if(array[i][j]<target)
{
j++;
continue;
}
else if(array[i][j]==target)
return true;
}
return false;
}
};
2 请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
//length为牛客系统规定字符串输出的最大长度,固定为一个常数
class Solution {
public:
void replaceSpace(char *str,int length)
{//考虑字符串长度的变化以及是否越界!
if(str==NULL && length==0)
return;
//考虑替换后字符串的长度是否越界
int oldnumber=0;
int replacenumber=0;//记录空格个数
int i=0;
while(str[i]!='\0')
{
oldnumber++;
if(str[i]==' ')
replacenumber++;
i++;
}
int newlength=oldnumber+replacenumber*2;
if(newlength>length)
return;
//进行替换,注意保持插入后原始位置的移动
int j=oldnumber;//从最后一位往前替换
int pNew=newlength;//存放新的位置
while(pNew>j && j>=0)
{
if(str[j]==' ')
{
str[pNew--]='0';
str[pNew--]='2';
str[pNew--]='%';
}
else
str[pNew--]=str[j];
j--;
}
}
};