课后自主练习(implement)1087. 坏掉的彩灯 easy《编程思维与实践》个人学习笔记

题目

在这里插入图片描述
数据
3
RYBGRYBGR
!RGYB
!!!YGRB

思路

这个题目的要求注定给的字符串任取四个相邻的子字符串,RYBG各占据一个,于是我们可以遍历一遍字符串来看看RYBG对应的在哪个位次,然后mod4可以得到对应的第一次出现位置//注意可以有一个字符从头到尾都没出现过,需要特殊判断在哪个为止,比如说R从头到尾没出现过,那么就得 6 − f ( G ) − f ( Y ) − f ( B ) 6-f(G)-f(Y)-f(B) 6f(G)f(Y)f(B)
然后每次跨越4,看哪个字母变成了!+1即可

#include<iostream>
#include<cstring>
using namespace std;


void func(string & s)
{
    int light[130];
    memset(light, 0 , sizeof(light));

    int len = s.length();
    int i,j,k,l;
    i = j = k = l = 0;

    while(i < len && s[i] != 'R')
        i++;
    while(j < len && s[j] != 'B')
        j++;
    while(k < len && s[k] != 'Y')
        k++;
    while(l < len && s[l] != 'G')
        l++;


    if(i == len)
    {
        j%=4;k%=4;l%=4;
        i = 6 - j - k - l;
    }
    if(j == len)
    {
        i%=4;k%=4;l%=4;
        j = 6 - i - k - l;
    }
    if(k == len)
    {
        j%=4;i%=4;l%=4;
        k = 6 - j - i - l;
    }
    if(l == len)
    {
        j%=4;k%=4;i%=4;
        l = 6 - j - k - i;
    }
    
    i%=4;j%=4;k%=4;l%=4;
    //cout << i<<'R' << j <<'B'<< k<<'y' << l<<"g" <<endl;

    for(;i < len || j < len || k < len || l < len; i+=4, j+=4, k+=4, l+=4)
    {
        if(s[i] != 'R' && i < len)
            light['R']++;
        if(s[j] != 'B' && j < len)
            light['B']++;
        if(s[k] != 'Y' && k < len)
            light['Y']++;
        if(s[l] != 'G' && l < len)
            light['G']++;
    }
    cout << light['R'] << " " << light['B'] << " " << light['Y'] << ' ' << light['G'] << endl;

}

int main()
{
    int t;
    cin >> t;
    for(int i = 0; i < t; i++)
    {

        cout << "case #" << i << ":"<<endl;
        string s;
        cin >> s;
        func(s);
    }

    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值