编程学习

华为oj

计算字符串最后一个单词的长度,单词以空格隔开

#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;    
}
写出一个程序,接受一个有字母和数字以及空格组成的字符串,和一个字符,然后输出输入字符串中含有该字符的个数。不区分大小写。

#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;
}

•连续输入字符串,请按长度为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;
}
写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串。( 多组同时输入  

#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;
}

输入一个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;
}

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
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--; 
        }     
	}
};




 
   
















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值