string类题目练习

字符串里面最后一个单词的长度

题目描述:输入一行字符串,有很多个单词,单词以空格隔开。计算字符串最后一个单词的长度

#include<iostream>
using namespace std;
#include<string>
int main()
{
	string line;
	while (getline(cin, line))
	{
		size_t pos = line.rfind(' ');
		cout << line.size() - pos - 1 << endl;
	}
	return 0;
}

1.rfind():从字符串pos位置开始往前找字符c,并且返回该字符在字符串的位置
思路:本题目中使用rfind函数将空格前的字符找出来,在使用全部的长度减去前部分长度,剩余的就是后半段的长度。

仅仅反转字母


class Solution {
public:
    bool isLetter(char ch)//bool类型只有俩种返回方式true和false
    {
        if (ch >= 'a' && ch <= 'z')//判断是不是小写字母
        {
            return true;
        }
        if (ch >= 'A' && ch <= 'Z')//判断是不是大写字母
        {
            return true;
        }
        return false;
    }
    string reverseOnlyLetters(string S) {
        if (S.empty())//判空
        {
            return S;
        }
        size_t begin = 0;
        size_t end = S.size() - 1;
        while (begin < end)
        {
            while (begin < end && !isLetter(S[begin]))
            {
                begin++;
            }
            while (begin < end && !isLetter(S[end]))
            {
                end--;
            }

        }
        swap(S[begin], S[end]);//交换函数
        ++begin;
        --end;
        return S;

    }

};

进制转换

题目描述:给定一个十进制数 M ,以及需要转换的进制数 N 。将十进制数 M 转化为 N 进制数。
思路:所有的进制转换都是将数字除以相应的转换的进制,本质都是相同的在这里插入图片描述
那么我们应该怎么获取每一位数字呢,一般的解决方法是使用取模的办法,将数字进行取模后得到相应位数的数字,在相除得到剩余的数字,以此以往得到每一个位数
但是题目上说明有0和负数,所以我们应该考虑在负数转化成正数在最后填上负号就好,此代码中就是使用bool类型来判断数字是否为负数,在最后使用string类中+=将“-”添上,在使用reverse函数将负号转换到前面。
知识点:**reverse()函数用来翻转数组,字符串,向量;

头文件:#include

reverse(s.begin(),s.end()); //翻转整个字符串
reverse(s.begin()+i,s.begin()+k); //翻转下标i到k(注意不包含k)

reverse(a,a+n);//n为数组长度 翻转整个数组

reverse(a+i,a+k);//翻转指定范围 下标为i到k(不包括k)

reverse(vect.begin(),vect.end());//写法和数组一样**

#include<iostream>
using namespace std;
#include<string>
#include<algorithm>//reverse函数的头文件

int main()
{
	int M, N;
	cin >> M >> N;
	string t = "0123456789ABCDEF";
	string ans = "";
	bool fu = false;
	if (M == 0)
	{
		cout << "0" << endl;
	}
	if (M < 0)
	{
		fu = true;
		M = -M;
	}
	while (M)
	{
		ans = ans + t[M % N];
		M = M / N;
	}
	if (fu)
	{
		ans += "-";
	}
	reverse(ans.begin(), ans.end());
	cout << ans << endl;
	return 0;
}

运行结果如下:
在这里插入图片描述

计算糖果

题目描述:A,B,C三个人是好朋友,每个人手里都有一些糖果,我们不知道他们每个人手上具体有多少个糖果,但是我们知道以下的信息:
A - B, B - C, A + B, B + C. 这四个数值.每个字母代表每个人所拥有的糖果数.
现在需要通过这四个数值计算出每个人手里有多少个糖果,即A,B,C。这里保证最多只有一组整数A,B,C满足所有题设条件。

思路:本题主要使用数学逻辑进行计算,但是需要注意的是每个计算的数字都得使用上述原表达式俩俩结合的方式使用,才可以计算出对应的数字。

#include <iostream>
using namespace std;

int main()
{
    int aMinb, bMinc, aAddb, bAddc;
    int a = 0, b = 0, c = 0;
    cin >> aMinb >> bMinc >> aAddb >> bAddc;
    for(a = 0; a <= 30; a++){
        for(b = 0; b <= 30; b++){
            for(c = 0; c <= 30; c++){
                if(a-b == aMinb && b-c == bMinc && a+b == aAddb && b+c == bAddc){
                    cout << a << " " << b << " " << c << endl;
                    return 0;
                }
            }
        }
    }
    cout << "No" << endl;
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值