您的位置:首页 > 其它

2018.1.24 看了半天KMP算法没完全搞懂!明天继续

2018-01-24 17:19 211 查看
第一道:

 只使用一个if语句将一个整数之前的所有正整数存到一个字符串中,同时,3的倍数改为fizz,5的倍数为buzz,既是3的倍数又是5的倍数存fizz buzz。

说只能使用一个if语句,所以怎么判断是否为3的倍数,5的倍数就成了问题。

(感觉不能用else if吧,要是能用直接判断就好)

想到了用循环,核心思想是,每三次改为fizz,然后用一个if判断是否为5的倍数。

但是在写的过程中发现。。。。。。

while语句有判断的功能啊...

于是:

    vector<string> fizzBuzz(int n)
{
vector<string> a(n);
int x=1;
while(x<=n)
{
while(x%3!=0&&x%5!=0&&x<=n)
{
a[x-1]=to_string(x);
x++;
}
while(x%3==0&&x%5==0&&x<=n)
{
a[x-1]="fizz buzz";
x++;
}
while(x%3!=0&&x%5==0&&x<=n)
{
a[x-1]="buzz";
x++;
}
while(x%3==0&&x%5!=0&&x<=n)
{
a[x-1]="fizz";
x++;
}
}
return a;
}
 感觉有点..投机取巧?,提交了 AC了...
第二道:

 从一个字符串中找另一个字符串,找到了返回1,没找到返回-1.

挑战说O(n^2)是可接受的,但是可以O(n)吗,还提示KMP算法....

先写一个暴力的: int strStr(const char *s, const char *p) {
if(s==NULL)
return -1;
if(p==NULL)
return -1;
int sLen = strlen(s);
int pLen = strlen(p);
int i = 0;
int j = 0;
while (i < sLen && j < pLen)
{
if (s[i] == p[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j == pLen)
return i-j;
else
return -1;
}
  提交了,AC了.
然后去看了KMP算法...
花了不少时间了解了算法,但是关于算法中next数组的求法还不是很熟悉。
由于时间不够,匆忙之中写下博客,明天继续..
争取完成时间复杂度O(n)的

ps:了解后KMP算法的时间复杂度其实是O(m+n).......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: