[数据结构]一些有意思题目(一)
2015-01-20 19:58
169 查看
1,求两个数的最大公约数
[cpp] view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
int gcd(int i,int j)
{
while(i != j)
{
if(i > j)
{
i -= j;
}
else
{
j -= i;
}
}
}
2,将abcdefg 字符串向左移动三位变成 defgabc
方法:
第一步:abcdefg ---> cbadefg
第二步:cbadefg ---> cbagfed
第三步:cbagfed ---> defgabc
以上方法优点是 需要存储空间少,
3,C语言计算汉诺塔最小移动步数(一)
当只有一个盘子即 n=1时,最小步数为s(1)=1
当有两个盘子的时 n=2时,最小步数为s(2)=s(1)*2+1
当有三个盘子的时 n=3时,最小步数为s(3)=s(2)*2+1
以此类推,可以用递归方法 s(n)=s(n-1)*2+1;
4,求问A字符串中是否包含B字符串中的字母
假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有?比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,所有在string2里的字母string1也都有。
方法1,分别对两个字符串排序,然后比较,时间复杂度是O(mlogm)+O(nlogn)+O(m+n)
方法2,计数排序的方法,时间复杂度是O(n+m)+O(n+m)=O(n+m)。确定是占用空间
方法3,hash表的方法,时间复杂度是O(n+m)
a、hash[26],先全部清零,然后扫描短的字符串,若有相应的置1,
b、计算hash[26]中1的个数,记为m
c、扫描长字符串的每个字符a;若原来hash[a] == 1 ,则修改hash[a] = 0,并将m减1;若hash[a] == 0,则不做处理
d、若m == 0 or 扫描结束,退出循环。
[cpp] view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1="ABCDEFGHLMNOPQRS";
string str2="DCGSRQPOM";
// 开辟一个辅助数组并清零
int hash[26] = {0};
// num为辅助数组中元素个数
int num = 0;
// 扫描短字符串
for (int j = 0; j < str2.length(); j++)
{
// 将字符转换成对应辅助数组中的索引
int index = str1[j] - 'A';
// 如果辅助数组中该索引对应元素为0,则置1,且num++;
if (hash[index] == 0)
{
hash[index] = 1;
num++;
}
}
// 扫描长字符串
for (int k = 0; k < str1.length(); k++)
{
int index = str1[k] - 'A';
// 如果辅助数组中该索引对应元素为1,则num--;为零的话,不作处理(不写语句)。
if(hash[index] ==1)
{
hash[index] = 0;
num--;
if(num == 0) //m==0,即退出循环。
break;
}
}
// num为0说明长字符串包含短字符串内所有字符
if (num == 0)
cout << "true" << endl;
else
cout << "false" << endl;
return 0;
}
方法4,素数方法
a.定义最小的26个素数分别与字符'A'到'Z'对应。
b.遍历长字符串,求得每个字符对应素数的乘积。
c.遍历短字符串,判断乘积能否被短字符串中的字符对应的素数整除。
d.输出结果。
[cpp] view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
int gcd(int i,int j)
{
while(i != j)
{
if(i > j)
{
i -= j;
}
else
{
j -= i;
}
}
}
2,将abcdefg 字符串向左移动三位变成 defgabc
方法:
第一步:abcdefg ---> cbadefg
第二步:cbadefg ---> cbagfed
第三步:cbagfed ---> defgabc
以上方法优点是 需要存储空间少,
3,C语言计算汉诺塔最小移动步数(一)
当只有一个盘子即 n=1时,最小步数为s(1)=1
当有两个盘子的时 n=2时,最小步数为s(2)=s(1)*2+1
当有三个盘子的时 n=3时,最小步数为s(3)=s(2)*2+1
以此类推,可以用递归方法 s(n)=s(n-1)*2+1;
4,求问A字符串中是否包含B字符串中的字母
假设这有一个各种字母组成的字符串A,和另外一个字符串B,字符串里B的字母数相对少一些。什么方法能最快的查出所有小字符串B里的字母在大字符串A里都有?比如,如果是下面两个字符串:
String 1: ABCDEFGHLMNOPQRS
String 2: DCGSRQPO
答案是true,所有在string2里的字母string1也都有。
方法1,分别对两个字符串排序,然后比较,时间复杂度是O(mlogm)+O(nlogn)+O(m+n)
方法2,计数排序的方法,时间复杂度是O(n+m)+O(n+m)=O(n+m)。确定是占用空间
方法3,hash表的方法,时间复杂度是O(n+m)
a、hash[26],先全部清零,然后扫描短的字符串,若有相应的置1,
b、计算hash[26]中1的个数,记为m
c、扫描长字符串的每个字符a;若原来hash[a] == 1 ,则修改hash[a] = 0,并将m减1;若hash[a] == 0,则不做处理
d、若m == 0 or 扫描结束,退出循环。
[cpp] view plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
#include <iostream>
#include <string>
using namespace std;
int main()
{
string str1="ABCDEFGHLMNOPQRS";
string str2="DCGSRQPOM";
// 开辟一个辅助数组并清零
int hash[26] = {0};
// num为辅助数组中元素个数
int num = 0;
// 扫描短字符串
for (int j = 0; j < str2.length(); j++)
{
// 将字符转换成对应辅助数组中的索引
int index = str1[j] - 'A';
// 如果辅助数组中该索引对应元素为0,则置1,且num++;
if (hash[index] == 0)
{
hash[index] = 1;
num++;
}
}
// 扫描长字符串
for (int k = 0; k < str1.length(); k++)
{
int index = str1[k] - 'A';
// 如果辅助数组中该索引对应元素为1,则num--;为零的话,不作处理(不写语句)。
if(hash[index] ==1)
{
hash[index] = 0;
num--;
if(num == 0) //m==0,即退出循环。
break;
}
}
// num为0说明长字符串包含短字符串内所有字符
if (num == 0)
cout << "true" << endl;
else
cout << "false" << endl;
return 0;
}
方法4,素数方法
a.定义最小的26个素数分别与字符'A'到'Z'对应。
b.遍历长字符串,求得每个字符对应素数的乘积。
c.遍历短字符串,判断乘积能否被短字符串中的字符对应的素数整除。
d.输出结果。
相关文章推荐
- [数据结构]一些有意思题目(一)
- 一些数据结构题目的代码片段
- 关于线性表的一些很有意思的题目1
- 前端·面试 记录一些有意思的题目
- 【C语言】一些有意思的C语言题目,
- 「前端 · 面试」记录一些有意思的题目(一)
- 一些有意思的JavaScript题目.
- 【C语言】一些有意思的C语言题目,
- cpp primer plus中一些有意思的题目
- 一些有意思的题目,3题,看看你能不能全部做对?
- 一些比较有意思的题目
- 一些数据结构的题目
- 一些有意思的题目之蚂蚁过河
- sql 一些题目
- 谈谈一些有趣的CSS题目(八)-- 纯CSS的导航栏Tab切换方案
- 华为,金蝶,阿里软件等的一些最新的笔试题目
- 【数据结构上机练习】考试题目 2
- 一个很有意思公司的题目
- HTML5对表单的一些有意思的改进
- PHP一些有意思的小区别