字符串问题

  1. 输入问题
    题目:TeX中的引号
    在TeX中,左双引号是 “ `` ”,右双引号是 “ " ” 。输入一篇包含双引号的文章,你的任务是把它转换成TeX的格式。
    样例输入:
    “To be or not to be,” queth the Bard,“that is the question”.
    样例输出:
    ``To be or not to be,’’ quoth the Bard,``that is the question’’.

思路:这道问题的关键是,怎么能遇到空格、换行符等不停下来。并且本题不用对字符串进行存储,直接判断并输出就行。字符不能存储为char 。因为要判断EOF不是char,我用cout << EOF 输出为-1。如果强制为char则无法和普通字符区分。

#include <stdio.h>
using namespace std;
int main()
{
	int c,p=1;
	while((c=getchar())!=EOF)
	{
		if(c=='"') {printf("%s",p? "``":"''");p=!p;} //因为p是做0,1判断的,所以直接取反
		else
			printf("%c",c);
	}
	return 0;
}

题目:最长不含重复字符的子字符串 (双指针问题)
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
假设字符串中只包含从’a’到’z’的字符。

样例
输入:“abcabc”
输出:3

思路:双指针问题,如果两个指针同时,单调向着同一个方向可以运用双指针问题,就是指针a,b开始在起点,b右移。用map记录每个字符出现的次数,如果字符出现次数>1,a右移

class Solution {
public:
    int longestSubstringWithoutDuplication(string s) {
        int a=0,b;
        int res=0;
        unordered_map<char,int> req;
        for(b=0;b<s.size();b++)
        {
            req[s[b]]++;
            while(req[s[b]]>1)
            {
                req[s[a]]--;
                a++;
                if(req[s[b]]==1) break;
            }
            res = max(res,b-a+1);
        }
        return res;
    }
};

题目:丑数(通过题目,猜测解法,然后验证)
我们把只包含因子2、3和5的数称作丑数(Ugly Number)。
例如6、8都是丑数,但14不是,因为它包含因子7。
求第n个丑数的值。

样例
输入:5
输出:5
注意:习惯上我们把1当作第一个丑数

思路:题目让输出第n个丑数的值,丑数太多,肯定不能一个一个列举,是有规律的,要猜测规律,然后验证他的正确性。这种题比较难猜,这道题,题目说1是丑数,所以创建三个指针 a,b,c指向1。
创建三个int ra,rb,rc。
ra = 12; rb = 13; rc = 15;取最小的加到丑数集合中,此时i指向2
ra = 2
2;rb = 13; rc = 15;同理取最小…

class Solution {
public:
    int getUglyNumber(int n) {
        if(n==0 || n==1) return n;
        vector<int> req;
        req.push_back(1);
        int a = 0,b = 0,c = 0;
        while(--n)
        {
            int t = min(req[a]*2,min(req[b]*3,req[c]*5));
            req.push_back(t);
            if(req[a]*2==t) a++;
            if(req[b]*3==t) b++;
            if(req[c]*5==t) c++;
        }
        return req.back();
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值