zoukankan      html  css  js  c++  java
  • [数据结构]一些有意思题目(一)

    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.输出结果。 

  • 相关阅读:
    redis后台启动配置
    Go匿名函数
    Java中的ExceptionInInitializerError异常及解决方法
    数据库备份工具mysqldump重要参数详解
    Nginx初识
    找不到或无法加载主类
    类加载机制与反射(二)
    JavaScript 数据结构与算法之美
    JavaScript 数据结构与算法之美
    JavaScript 数据结构与算法之美
  • 原文地址:https://www.cnblogs.com/zhiliao112/p/4237163.html
Copyright © 2011-2022 走看看