L1-059 敲笨钟 加力扣日常刷题

L1-059 敲笨钟 (20 分)

微博上有个自称“大笨钟V”的家伙,每天敲钟催促码农们爱惜身体早点睡觉。为了增加敲钟的趣味性,还会糟改几句古诗词。其糟改的方法为:去网上搜寻压“ong”韵的古诗词,把句尾的三个字换成“敲笨钟”。例如唐代诗人李贺有名句曰:“寻章摘句老雕虫,晓月当帘挂玉弓”,其中“虫”(chong)和“弓”(gong)都压了“ong”韵。于是这句诗就被糟改为“寻章摘句老雕虫,晓月当帘敲笨钟”。

现在给你一大堆古诗词句,要求你写个程序自动将压“ong”韵的句子糟改成“敲笨钟”。

输入格式:

输入首先在第一行给出一个不超过 20 的正整数 N。随后 N 行,每行用汉语拼音给出一句古诗词,分上下两半句,用逗号 , 分隔,句号 . 结尾。相邻两字的拼音之间用一个空格分隔。题目保证每个字的拼音不超过 6 个字符,每行字符的总长度不超过 100,并且下半句诗至少有 3 个字。

输出格式:

对每一行诗句,判断其是否压“ong”韵。即上下两句末尾的字都是“ong”结尾。如果是压此韵的,就按题面方法糟改之后输出,输出格式同输入;否则输出 Skipped,即跳过此句。

输入样例:

5
xun zhang zhai ju lao diao chong, xiao yue dang lian gua yu gong.
tian sheng wo cai bi you yong, qian jin san jin huan fu lai.
xue zhui rou zhi leng wei rong, an xiao chen jing shu wei long.
zuo ye xing chen zuo ye feng, hua lou xi pan gui tang dong.
ren xian gui hua luo, ye jing chun shan kong.

输出样例:

xun zhang zhai ju lao diao chong, xiao yue dang lian qiao ben zhong.
Skipped
xue zhui rou zhi leng wei rong, an xiao chen jing qiao ben zhong.
Skipped
Skipped

解题的时候注意押韵要判断逗号前和句号前,注意读取的时候用不了gets!

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

int main()
{
	int N;
	string s;
	cin>>N;
	getchar();
	while(N--)
	{
		getline(cin,s);
		int ok = 1;
		for(int i = 0;i < s.length();i++)
		{
			if(s[i] == ',')		//判断逗号的ong 押韵!!
			{
				if(!(s[i-1] == 'g' && s[i-2] == 'n' && s[i-3] == 'o'))
				{
					ok = 0;
					break;
				}
			}
			if(s[i] == '.')
			{
				if(s[i-1] == 'g' && s[i-2] == 'n' && s[i-3] == 'o')
				{
					int j = i;					//用j回溯到倒数第4个词的结尾 
					for(int kong = 0;kong < 3;j--)
					{
						if(s[j] == ' ') kong++;
					}
					s.replace(j+1, i-j, " qiao ben zhong.");
					break;
				}
				else ok = 0;
			} 
		}
		if(!ok) cout<<"Skipped"<<endl;
		else cout<<s<<endl;		
	}
	return 0;
}

2100. 适合打劫银行的日子

你和一群强盗准备打劫银行。给你一个下标从 0 开始的整数数组 security ,其中 security[i] 是第 i 天执勤警卫的数量。日子从 0 开始编号。同时给你一个整数 time

如果第 i 天满足以下所有条件,我们称它为一个适合打劫银行的日子:

  • i 天前和后都分别至少有 time 天。
  • i 天前连续 time 天警卫数目都是非递增的。
  • i 天后连续 time 天警卫数目都是非递减的。

更正式的,第 i 天是一个合适打劫银行的日子当且仅当:security[i - time] >= security[i - time + 1] >= ... >= security[i] <= ... <= security[i + time - 1] <= security[i + time].

请你返回一个数组,包含 所有 适合打劫银行的日子(下标从 0 开始)。返回的日子可以 任意 顺序排列。

示例 1:

输入:security = [5,3,3,3,5,6,2], time = 2
输出:[2,3]
解释:
第 2 天,我们有 security[0] >= security[1] >= security[2] <= security[3] <= security[4] 。
第 3 天,我们有 security[1] >= security[2] >= security[3] <= security[4] <= security[5] 。
没有其他日子符合这个条件,所以日子 2 和 3 是适合打劫银行的日子。

示例 2:

输入:security = [1,1,1,1,1], time = 0
输出:[0,1,2,3,4]
解释:
因为 time 等于 0 ,所以每一天都是适合打劫银行的日子,所以返回每一天。

示例 3:

输入:security = [1,2,3,4,5,6], time = 2
输出:[]
解释:
没有任何一天的前 2 天警卫数目是非递增的。
所以没有适合打劫银行的日子,返回空数组。

示例 4:

输入:security = [1], time = 5
输出:[]
解释:
没有日子前面和后面有 5 天时间。
所以没有适合打劫银行的日子,返回空数组。

提示:

  • 1 <= security.length <= 105
  • 0 <= security[i], time <= 105

class Solution {
public:
    vector<int> goodDaysToRobBank(vector<int>& security, int time) {
        int n = security.size();
        vector<int> l(n), r(n), v;
        for(int i = 1;i <n;i ++)
        {
            if(security[i] <= security[i - 1])
                l[i] = l[i -1] +1;
            if(security[n - i - 1] <= security[n - i])
                r[n - i - 1] = r[n - i] + 1;
        }
        for(int i = 0;i < n;i ++)
        {
            if(l[i]>=time&&r[i]>=time)
                v.emplace_back(i);
        }
        return v;
    }
};

在这里

emplace_back()是c++11的新特性。
和push_back()的区别在于
push_back()方法要调用构造函数和复制构造函数,这也就代表着要先构造一个临时对象,然后把临时的copy构造函数拷贝或者移动到容器最后面。
而emplace_back()在实现时,则是直接在容器的尾部创建这个元素,省去了拷贝或移动元素的过程。

844. 比较含退格的字符串

给定 st 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true# 代表退格字符。

**注意:**如果对空文本输入退格字符,文本继续为空。

示例 1:

输入:s = "ab#c", t = "ad#c"
输出:true
解释:s 和 t 都会变成 "ac"。

示例 2:

输入:s = "ab##", t = "c#d#"
输出:true
解释:s 和 t 都会变成 ""。

示例 3:

输入:s = "a#c", t = "b"
输出:false
解释:s 会变成 "c",但 t 仍然是 "b"。

提示:

  • 1 <= s.length, t.length <= 200
  • st 只含有小写字母以及字符 '#'

题本身不难主要是学习学习双指针

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int n = s.length() - 1,m  = t.length() - 1;
        int nl = 0, ml = 0;
        while(n>=0||m >=0)
        {
            //对第一个
            while(n>=0)
            {
                if(s[n] == '#')
                {
                    nl ++,n--;
                }
                else if(nl > 0)
                {
                    nl -- ,n --;
                }
                else break;
            }
            //对第二个
            while(m >=0)
            {
                if(t[m] == '#')
                {
                    ml ++,m--;
                }
                else if(ml > 0)
                {
                    ml--,m--;
                }
                else break;
            }
            //在此m和n的数值代表的是目前为止删除过后的尾
            if(n>=0&&m>=0)
            {
                if(s[n]!=t[m]) return false;
            }
            else {
                if(n >= 0|| m>=0) return false;
            }
            n--,m--;
        }
        return true;
    }
};

986. 区间列表的交集

给定两个由一些 闭区间 组成的列表,firstListsecondList ,其中 firstList[i] = [starti, endi]secondList[j] = [startj, endj] 。每个区间列表都是成对 不相交 的,并且 已经排序

返回这 两个区间列表的交集

形式上,闭区间 [a, b](其中 a <= b)表示实数 x 的集合,而 a <= x <= b

两个闭区间的 交集 是一组实数,要么为空集,要么为闭区间。例如,[1, 3][2, 4] 的交集为 [2, 3]

示例 1:

img

输入:firstList = [[0,2],[5,10],[13,23],[24,25]], secondList = [[1,5],[8,12],[15,24],[25,26]]
输出:[[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]]

示例 2:

输入:firstList = [[1,3],[5,9]], secondList = []
输出:[]

示例 3:

输入:firstList = [], secondList = [[4,8],[10,12]]
输出:[]

示例 4:

输入:firstList = [[1,7]], secondList = [[3,10]]
输出:[[3,7]]

通过这个网站所分享的知识,终于弄懂了区间问题!

https://mp.weixin.qq.com/s/Eb6ewVajH56cUlY9LetRJw

class Solution {
public:
    vector<vector<int>> intervalIntersection(vector<vector<int>>& A, vector<vector<int>>& B) {
        int cnt = 0;
        vector<vector<int>> vec;
        vector<int> tmp(2);
        for(int i=0;i<A.size()&&cnt<B.size();)
        {
            if(A[i][0]>B[cnt][1])
            {
                cnt++;
            }
            else if(A[i][1]<B[cnt][0])
            {
                i++;
            }
            else if(A[i][1]<B[cnt][1])
            {
                tmp[0] = max(A[i][0],B[cnt][0]);
                tmp[1] = A[i][1];
                vec.push_back(tmp);
                i++;
            }
            else
            {
                tmp[0] = max(A[i][0],B[cnt][0]);
                tmp[1] = B[cnt][1];
                vec.push_back(tmp);
                cnt++;
            }
        }
        return vec;
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值