• [数据结构]一些有意思题目(一)


    1,求两个数的最大公约数

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. int gcd(int i,int j)  
    2. {  
    3.     while(i != j)  
    4.     {  
    5.         if(i > j)  
    6.         {  
    7.             i -= j;  
    8.         }  
    9.         else  
    10.         {  
    11.             j -= i;  
    12.         }  
    13.     }  
    14. }  


    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在CODE上查看代码片派生到我的代码片
     
    1.         #include <iostream>     
    2. #include <string>     
    3. using namespace std;    
    4.     
    5. int main()    
    6. {    
    7.     string str1="ABCDEFGHLMNOPQRS";    
    8.     string str2="DCGSRQPOM";    
    9.     // 开辟一个辅助数组并清零     
    10.     int hash[26] = {0};    
    11.     // num为辅助数组中元素个数     
    12.     int num = 0;    
    13.     // 扫描短字符串     
    14.     for (int j = 0; j < str2.length(); j++)    
    15.     {    
    16.         // 将字符转换成对应辅助数组中的索引     
    17.         int index = str1[j] - 'A';    
    18.         // 如果辅助数组中该索引对应元素为0,则置1,且num++;     
    19.         if (hash[index] == 0)    
    20.         {    
    21.             hash[index] = 1;    
    22.             num++;    
    23.         }    
    24.     }    
    25.     // 扫描长字符串     
    26.     for (int k = 0; k < str1.length(); k++)    
    27.     {    
    28.         int index = str1[k] - 'A';    
    29.         // 如果辅助数组中该索引对应元素为1,则num--;为零的话,不作处理(不写语句)。     
    30.         if(hash[index] ==1)    
    31.         {    
    32.             hash[index] = 0;    
    33.             num--;    
    34.             if(num == 0)    //m==0,即退出循环。     
    35.                 break;    
    36.         }    
    37.     }    
    38.     // num为0说明长字符串包含短字符串内所有字符     
    39.     if (num == 0)    
    40.         cout << "true" << endl;    
    41.     else    
    42.         cout << "false" << endl;    
    43.     return 0;    
    44. }   


    方法4,素数方法
    a.定义最小的26个素数分别与字符'A'到'Z'对应。
    b.遍历长字符串,求得每个字符对应素数的乘积。
    c.遍历短字符串,判断乘积能否被短字符串中的字符对应的素数整除。
    d.输出结果。 

  • 相关阅读:
    PAT (Advanced Level) Practice 1100 Mars Numbers (20分)
    PAT (Advanced Level) Practice 1107 Social Clusters (30分) (并查集)
    PAT (Advanced Level) Practice 1105 Spiral Matrix (25分)
    PAT (Advanced Level) Practice 1104 Sum of Number Segments (20分)
    PAT (Advanced Level) Practice 1111 Online Map (30分) (两次迪杰斯特拉混合)
    PAT (Advanced Level) Practice 1110 Complete Binary Tree (25分) (完全二叉树的判断+分享致命婴幼儿错误)
    PAT (Advanced Level) Practice 1109 Group Photo (25分)
    PAT (Advanced Level) Practice 1108 Finding Average (20分)
    P6225 [eJOI2019]异或橙子 树状数组 异或 位运算
    P4124 [CQOI2016]手机号码 数位DP
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4237163.html
Copyright © 2020-2023  润新知