赛码网——打字

题目描述

小明很喜欢打字,今天小红给了小明一个字符串。

这个字符串只包含大写和小写字母。

我们知道,按下CapsLock键,可以切换大小写模式。

我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。

在大写模式的时候,按下shift+字母键,就能写出小写字母。

现在问题来了,给你一个字符串,问你最少使用多少个按键,就可以写出这个字符串呢?

注意,按shift和字母键,算两次按键。开始时均为小写状态。

输入描述

第一行一个T,表示有T组输入。

接下来T组数据:

每组数据一个字符串s,s的长度小于等于100。仅包含大小写字母。

输出描述

对于每组数据,输出最少按键次数。

解题思路

  1. 每个字符算一次键入次数;
  2. 当输入字符与当前输入状态不匹配时,需要额外键入shift或Capslock用于切换输入状态;
  3. 当前待输入字符及其之后的字符均是同一种输入状态时,显然用CapsLock切换更为划算,而仅有一个字符需要切换,则适合采用shift;

仅有字母字符输入才涉及大小写切换,其余字符不涉及大小写切换
所以有必要判断字符是否属于字母。

实现思路

  1. 引入currentCap记录当前输入状态;
  2. 获取字符串大小,作为基础键入次数;
  3. 遍历字符串,如果字符与当前输入状态不匹配,检查后一个字符是否同当前字符为相同的大小写状态,相同切换currentCap变量,视作按下CapsLock,否则不切换,但均需增加计数,视作按键切换;

代码实现

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<int> CalculateKeyCounts(const vector<string>& str)
{
    int n = str.size();
    vector<int> results(n);
    while (n--)
    {
        int count = str[n].size(); //base count
        bool currentCap = false;
        // bool needCap;
        // int smallCount = 0, bigCount = 1;
        
        for (int i = 0; i < str[n].size(); i++)
        {
            if (str[n][i] >= 'A' && str[n][i] <= 'Z' && currentCap == false)
            {
                if (i < str[n].size() - 1 && (str[n][i + 1] >= 'A' && str[n][i + 1] <= 'Z'))
                {
                    currentCap = true;
                }
                count++;
            }
            if (str[n][i] >= 'a' && str[n][i] <= 'z' && currentCap == true)
            {
                if (i < str[n].size() - 1 && (str[n][i + 1] >= 'a' && str[n][i + 1] <= 'z'))
                {
                    currentCap = false;
                }
                count++;
            }
        }
        results[n] = count;
    }
    return results;
}

int main()
{
    int T;
    cin >> T;
    vector<string> str(T);
    for (int t = 0; t < T; t++)
    {
        cin >> str[t];
    }
    vector<int> results = CalculateKeyCounts(str);
    for (auto result : results)
    {
        cout << result << endl;
    }
    return 0;
}

水平有限,如有错误,欢迎指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值