- 输入问题
题目: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 = 22;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();
}
};