华为上机练习题

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. // StringFun.cpp : 定义控制台应用程序的入口点。  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <iostream>  
  6. #include <assert.h>  
  7. #include <string>  
  8. #include <stdio.h>  
  9. #include <stdlib.h>  
  10. #include <memory.h>  
  11.   
  12. using namespace std;  
  13.   
  14. /*删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数*/  
  15. int Del_SubString(const char *src,const char *sub,char *des)  
  16. {  
  17.     assert(NULL!=src && NULL!=sub && NULL!=des);  
  18.     int cnt=0;  
  19.     int length_sub = strlen(sub);  
  20.     int length_src = strlen(src);  
  21.     char *temp = new char[length_sub+1];  
  22.     memset(temp,0,length_sub+1);  
  23.   
  24.     while (*src!='\0' && src<=src+length_src)  
  25.     {   
  26.         memcpy(temp,src,length_sub);  
  27.         if (strcmp(temp,sub)==0)  
  28.         {  
  29.             ++cnt;  
  30.             src+=length_sub;  
  31.         }   
  32.         else  
  33.         {  
  34.             *des = *src;  
  35.             ++des;  
  36.             ++src;  
  37.         }  
  38.     }  
  39.     delete[] temp;  
  40.     return cnt;  
  41. }  
  42. /***************************************************************************************************/  
  43. /*约瑟夫环问题:设有编号为1,2,……,n的n(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数, 
  44. 报m的人出圈,再从他的下一个人起重新报数,报到m时停止报数,报m的出圈,……,如此下去,直到所有人 
  45. 全部出圈为止。当任意给定n和m后,设计算法求n个人出圈的次序。 
  46. /***************************************************************************************************/  
  47. typedef struct _Node   
  48. {  
  49.     int num;  
  50.     _Node *next;  
  51. }Node;  
  52.   
  53. Node *CreatList(int n)  
  54. {  
  55.     Node *pHead = new Node;  
  56.     pHead->num=1;  
  57.     Node *pCur = pHead;  
  58.     for (int i=2;i<=n;++i)  
  59.     {  
  60.         Node *pTemp = new Node;  
  61.         pTemp->num = i;  
  62.         pCur->next = pTemp;  
  63.         pCur = pTemp;  
  64.     }  
  65.     pCur->next = pHead;  
  66.     return pHead;  
  67. }  
  68.   
  69. void JosephLoop(Node *pHead,int start,int interval,int n)  
  70. {  
  71.     Node *pCur = pHead;  
  72.     Node *pPre = NULL;  
  73.     Node *pPos = NULL;  
  74.     int cnt = n;  
  75.     while (pCur->num!=start)  
  76.         pCur = pCur->next;//找到开始位置      
  77.     while (cnt>0)  
  78.     {  
  79.         for (int i=1;i<interval;++i)  
  80.             pCur = pCur->next;//找到第interval个的前一个  
  81.         pPre = pCur;  
  82.         pPos = pCur->next;    //第interval个的位置  
  83.         cout<<pPos->num<<" ";  
  84.         pPre->next = pPos->next;  
  85.         delete pPos;  
  86.         --cnt;  
  87.         pCur = pCur->next;  
  88.     }  
  89.     cout<<endl;  
  90. }  
  91. void JosephLoop2(int *array,int interval,int length)  
  92. {  
  93.     int cnt   = length;//当前数组长度  
  94.     int i;  
  95.     int ivalchange = interval;//当前间隔  
  96.     int start = 0;            //开始位置  
  97.     int pos = 0;              //当前位置  
  98.     while (cnt>1)  
  99.     {  
  100.         pos = (start+ivalchange-1)%cnt;//interval位置  
  101.         cout<<array[pos]<<" ";  
  102.         ivalchange = array[pos];  
  103.         for (i=pos;i<cnt-1;++i)  
  104.             array[i]=array[i+1];//将pos到cnt-1的数据前移  
  105.         --cnt;  
  106.         start = pos%cnt;  
  107.     }  
  108.     cout<<array[0]<<endl;  
  109. }  
  110. /*********************************************************************************/  
  111. /*对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放且输出 
  112. 数组第一位放奇数  若奇数和偶数不等长,则把剩下的直接放到数组中。*/  
  113.   
  114. void Insert_S2B_Sort(int *array,int length)  
  115. {  
  116.     assert(NULL!=array && length>0);  
  117.     int i,j;  
  118.     int temp;  
  119.     for (i=1;i<length;++i)  
  120.     {  
  121.         if (array[i]<array[i-1])//需要插入  
  122.         {  
  123.             temp = array[i];  
  124.             for(j=i-1;j>=0&&array[j]>temp;--j)  
  125.                 array[j+1]=array[j];  
  126.             array[j+1]=temp;  
  127.         }  
  128.     }  
  129. }  
  130. void MyArrayOrder(int *src,int *des,int length)  
  131. {  
  132.     assert(NULL!=src && NULL!=des && length>0);  
  133.     int *ou_array = new int[length];  
  134.     int *ji_array = new int[length];  
  135.     int i=0,j=0,low,high;  
  136.     int ji_length=0,ou_length=0;  
  137.     Insert_S2B_Sort(src,length);//用插入排序进行从小到大排序  
  138.     for (low=0,high=length-1;low<length&&high>=0;++low,--high)  
  139.     {  
  140.         if (src[low]%2 == 1)  
  141.         {  
  142.             ji_array[i++]=src[low];  
  143.             ++ji_length;              //筛选出奇数数组和长度  
  144.         }  
  145.         if(src[high]%2 == 0)  
  146.         {  
  147.             ou_array[j++]=src[high];  
  148.             ++ou_length;              //帅选出偶数数组和长度  
  149.         }  
  150.     }  
  151.     //进行组合  
  152.     if (ji_length>ou_length)  
  153.     {  
  154.         for(i=0,j=0;i<length&&j<ou_length;i+=2,++j)  
  155.         {  
  156.             des[i]   = ji_array[j];  
  157.             des[i+1] = ou_array[j];  
  158.         }  
  159.         for(int l=0;l<ji_length-ou_length;++l)  
  160.             des[i+l]=ji_array[j+l];  
  161.     }   
  162.     else  
  163.     {  
  164.         for(i=0,j=0;i<length&&j<ji_length;i+=2,++j)  
  165.         {  
  166.             des[i]   = ji_array[j];  
  167.             des[i+1] = ou_array[j];  
  168.         }  
  169.         for(int l=0;l<ou_length-ji_length;++l)  
  170.             des[i+l]=ou_array[j+l];  
  171.     }  
  172.     delete[] ji_array;  
  173.     delete[] ou_array;  
  174. }  
  175.   
  176. /**********************************************************************************/  
  177. /*操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 < 50, 
  178. 用户任务的优先级 >= 50且 <= 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task[], 
  179. 长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能, 
  180. 将task[] 中的任务按照系统任务、用户任务依次存放到 system_task[] 数组和 user_task[] 数组中 
  181. (数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。  
  182. 例如:task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}    system_task[] = {0, 3, 1, 7, -1}     
  183. user_task[] = {4, 8, 2, 6, -1} 
  184. 函数接口    void scheduler(int task[], int n, int system_task[], int user_task[]) 
  185. /***********************************************************************************/  
  186. void scheduler(int *task,int *system_task,int *user_task,int length)  
  187. {  
  188.     assert(NULL!=task && NULL!=system_task && NULL!=user_task && length>0);  
  189.     int i,j,temp,temp_num,pos=0,end=length-1;  
  190.     int sys_length = 0,user_length = 0;  
  191.     int *array_num = new int[length];  
  192.     for (i = 0; i < length; ++i)  
  193.         array_num[i]=i;  
  194.   
  195.     for (i=1;i<length;++i)  
  196.     {  
  197.         temp = task[i];  
  198.         temp_num = array_num[i];  
  199.         if(task[i]<task[i-1])  
  200.         {  
  201.             for(j=i-1;j>=0&&task[j]>temp;--j)  
  202.             {  
  203.                 task[j+1]=task[j];  
  204.                 array_num[j+1]=array_num[j];  
  205.             }  
  206.             task[j+1]=temp;  
  207.             array_num[j+1]=temp_num;  
  208.         }  
  209.     }  
  210.     while (task[pos]<50)  
  211.         ++pos;           //找到>=50的第一个位置  
  212.     --pos;                 
  213.     while(task[end]>255)  
  214.         --end;          //找到<=255的位置  
  215.     for (i=0;i<=pos;++i)  
  216.     {  
  217.         system_task[i]=array_num[i];  
  218.         ++sys_length;  
  219.     }  
  220.     system_task[i] = -1;  
  221.     ++sys_length;  
  222.     for(j=0;i<=end;++i)  
  223.     {  
  224.         user_task[j++]=array_num[i];  
  225.         ++user_length;  
  226.     }  
  227.     user_task[j] = -1;  
  228.     ++user_length;  
  229.     for(i=0;i<sys_length;++i)  
  230.         cout<<system_task[i]<<" ";  
  231.     cout<<endl;  
  232.     for(i=0;i<user_length;++i)  
  233.         cout<<user_task[i]<<" ";  
  234.     cout<<endl;  
  235.     delete[] array_num;  
  236. }  
  237.   
  238. /****************************************************************************************************************/  
  239. /*给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数, 
  240. 则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边, 
  241. 按照一左一右的顺序,依次存放剩下的数。  
  242. 例如:input[] = {3, 6, 1, 9, 7}       output[] = {3, 7, 9, 6, 1}; 
  243.       input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7, 3}*/  
  244.   
  245. void array_sort(int *input,int *output,int length)  
  246. {  
  247.     assert(NULL!=input && NULL!=output && length>0);  
  248.     int mid = length/2;  
  249.     int left = mid-1;  
  250.     int rigth = mid+1;  
  251.     int i = length-1;  
  252.     Insert_S2B_Sort(input,length);  
  253.     output[mid]= input[i--];  
  254.     while (i>=0)  
  255.     {     
  256.         if(left>=0)  
  257.             output[left--]  = input[i--];  
  258.         if(rigth<length)  
  259.             output[rigth++] = input[i--];  
  260.     }  
  261.   
  262. }  
  263.   
  264. /*通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符, 
  265. 将非首次出现的字符过滤掉。比如字符串“abacacde”过滤结果为“abcde”。*/  
  266. void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr)  
  267. {  
  268.     assert(NULL!=pInputStr && NULL!=pOutputStr && lInputLen>0);  
  269.     bool array_flag[26]={0};  
  270.     while (lInputLen>0)  
  271.     {  
  272.         if (!array_flag[*pInputStr-'a'])  
  273.         {  
  274.             array_flag[*pInputStr-'a']=true;  
  275.             *pOutputStr++ = *pInputStr++;  
  276.         }   
  277.         else   
  278.         {  
  279.             ++pInputStr;  
  280.         }  
  281.         --lInputLen;  
  282.     }  
  283.     *pOutputStr='\0';  
  284. }  
  285.   
  286. /*通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 
  287. 压缩规则: 
  288. 1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。 
  289. 2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。*/  
  290. void IntToChar(int num,char *pOutPut)  
  291. {  
  292.     int shan  = num;  
  293.     int yushu = 0;  
  294.     char *pLow = pOutPut;  
  295.     char *pHigh;  
  296.     while (shan!=0)  
  297.     {  
  298.         yushu = shan%10;  
  299.         shan  = shan/10;  
  300.         *pOutPut++ = yushu + '0';  
  301.     }  
  302.     *pOutPut = '\0';  
  303.     pHigh = pOutPut -1;  
  304.     while (pLow<pHigh)  
  305.     {  
  306.         *pLow = *pLow^*pHigh;  
  307.         *pHigh = *pLow^*pHigh;  
  308.         *pLow = *pLow^*pHigh;  
  309.         ++pLow;  
  310.         --pHigh;  
  311.     }  
  312. }  
  313. void stringZip(const char *pInputStr, char *pOutputStr)  
  314. {  
  315.     char CharCur ;  
  316.     char CharNext ;  
  317.     char InttoStr[9];  
  318.     char *temp = InttoStr;  
  319.     int cnt = 1;      //计数  
  320.     while (*pInputStr!='\0')  
  321.     {  
  322.         CharCur  = *pInputStr;  
  323.         CharNext = *(pInputStr+1);  
  324.         if(CharCur!=CharNext)  
  325.         {  
  326.             if (cnt>1)  
  327.             {  
  328.                 IntToChar(cnt,temp);  
  329.                 while (*temp!='\0')  
  330.                 {  
  331.                     *pOutputStr++ = *temp++;  
  332.                 }      
  333.                 temp = InttoStr;  
  334.                 cnt = 1;  
  335.             }  
  336.             *pOutputStr++ = CharCur;  
  337.             ++pInputStr;  
  338.         }  
  339.         else  
  340.         {  
  341.             ++cnt;  
  342.             ++pInputStr;  
  343.         }  
  344.     }  
  345.     *pOutputStr = '\0';  
  346. }  
  347.   
  348. /*A,B两个数据,A递增数组,B递减数组。找出A、B两个数组中交集的第K大个元素。*/  
  349. int GetKNumber(int *arrayA,int *arrayB,int lengthA,int lengthB,int k)  
  350. {  
  351.     assert(NULL!=arrayA && NULL!=arrayB && lengthA>0 && lengthB>0);  
  352.     int high = lengthA-1;  
  353.     int low = 0;  
  354.     int cnt=0;  
  355.     while (high>=0 && low<lengthB)  
  356.     {  
  357.         if(arrayA[high]>arrayB[low])  
  358.             --high;  
  359.         else if(arrayA[high]<arrayB[low])  
  360.             ++low;  
  361.         else  
  362.         {  
  363.             ++cnt;  
  364.             if(cnt == k)  
  365.                 return arrayA[high];  
  366.             --high;  
  367.             ++low;  
  368.         }  
  369.     }  
  370.     return -1;//没找到  
  371. }  
  372.   
  373.   
  374. /**********************************************************************************/  
  375. /*字符滤除函数:滤除输入字符串中相同的字符 
  376. /***********************************************************************************/  
  377. void CharFliter(char *pInput,char *pOutput,int *Outlength)  
  378. {  
  379.     bool flag_array[256]={false};  
  380.     int i=0;  
  381.     *Outlength = 0;  
  382.     while (i<1000)  
  383.     {  
  384.         if (!flag_array[*pInput-'\0'])  
  385.         {  
  386.             flag_array[*pInput-'\0'] = true;  
  387.             *pOutput++ = *pInput++;  
  388.             ++(*Outlength);  
  389.         }   
  390.         else  
  391.         {  
  392.             ++pInput;  
  393.         }  
  394.         ++i;  
  395.     }  
  396. }  
  397.   
  398. /**********************************************************************************/  
  399. /*字符串滤除函数:滤除给定输入字符串中相同的单词,单词以空格或者逗号隔开。 
  400. /***********************************************************************************/  
  401. void StrFliter(char *pInput,char *pOutput,int *OutLength)  
  402. {  
  403.     char *input = pInput;  
  404.     char *pChar[256];  
  405.     *OutLength=0;  
  406.     char *temp;  
  407.     char *temp2;  
  408.     int i = 1,j,k;  
  409.     pChar[0] = input;  
  410.     while (*input!='\0')  
  411.     {  
  412.         if(*input==' ')  
  413.         {  
  414.             pChar[i++] = input+1;  
  415.         }  
  416.         if(*input==',')  
  417.         {  
  418.             *input = ' ';  
  419.             pChar[i++] = input+1;  
  420.         }  
  421.         ++input;  
  422.     }  
  423.     *input = ' ';  
  424.     for (j=0;j<i-1;++j)  
  425.     {  
  426.         temp = pChar[j];  
  427.         if(temp!=NULL)  
  428.         {  
  429.             for (k=j+1;k<i;++k)  
  430.             {  
  431.                 temp2 = pChar[k];  
  432.                 temp = pChar[j];  
  433.                 if(temp2!=NULL)  
  434.                 {  
  435.                     while (*temp!=' '&& *temp2!=' ')  
  436.                     {  
  437.                         if(*temp!=*temp2)  
  438.                             break;  
  439.                         ++temp;  
  440.                         ++temp2;  
  441.                     }  
  442.                     if(*temp ==' '&& *temp2 ==' ')  
  443.                         pChar[k]=NULL;  
  444.                 }  
  445.                   
  446.             }  
  447.         }  
  448.           
  449.     }  
  450.   
  451.     for (j=0;j<i;)  
  452.     {  
  453.         temp = pChar[j];  
  454.         if (pChar[j]!=NULL)  
  455.         {  
  456.             while (*temp!=' ')  
  457.             {  
  458.                 *pOutput++ = *temp++;  
  459.                 ++(*OutLength);  
  460.             }  
  461.             *pOutput++ = ' ';  
  462.             ++(*OutLength);  
  463.             ++j;  
  464.         }   
  465.         else  
  466.         {  
  467.             ++j;  
  468.         }  
  469.     }  
  470. }  
  471.   
  472.   
  473. int _tmain(int argc, _TCHAR* argv[])  
  474. {  
  475.     char des[100] = {'\0'};  
  476.     int cnt = Del_SubString("123abc12de1234fg1hi213j123k","123",des);  
  477.     cout<<"cnt = "<<cnt<<endl;  
  478.     cout<<"des : "<<des<<endl;  
  479.   
  480.     Node *pHead = CreatList(17);  
  481.     JosephLoop(pHead,3,5,17);  
  482.   
  483.     int array[]={3,1,2,4,8,0,3,6};  
  484.     int length = sizeof(array)/sizeof(array[0]);  
  485.     JosephLoop2(array,7,length);  
  486.   
  487.     int src[]={2,3,14,6,2,15,12,14,4,11};  
  488.     int des1[100];  
  489.     int length_src = sizeof(src)/sizeof(src[0]);  
  490.     MyArrayOrder(src,des1,length_src);  
  491.     for (int i=0;i<length_src;++i)  
  492.     {  
  493.         cout<<des1[i]<<" ";  
  494.     }  
  495.     cout<<endl;  
  496.   
  497.     int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99,114,170,20,11,17};  
  498.     int length_task = sizeof(task)/sizeof(task[0]);  
  499.     int system_task[100];  
  500.     int user_task[100];  
  501.     scheduler(task,system_task,user_task,length_task);  
  502.   
  503.     int input[] = {3, 6, 1, 9, 7, 8};  
  504.     int output[20];  
  505.     int length_input = sizeof(input)/sizeof(input[0]);  
  506.     array_sort(input,output,length_input);  
  507.     for (int i=0;i<length_input;++i)  
  508.     {  
  509.         cout<<output[i]<<" ";  
  510.     }  
  511.     cout<<endl;  
  512.   
  513.     char *InputStr = "abacacde";  
  514.     long Ilength = strlen(InputStr);  
  515.     char OutputStr[255];  
  516.     stringFilter(InputStr, Ilength, OutputStr);  
  517.     cout<<OutputStr<<endl;  
  518.   
  519.     char *InputStr2 = "abbbddcppppiiigggppppppiiiiiiiiiggggggbbddcggggggggg";  
  520.     int Ilength2 = strlen(InputStr2);  
  521.     char OutputStr2[255]={'a'};  
  522.     stringZip(InputStr2, Ilength2, OutputStr2);  
  523.     cout<<OutputStr2<<endl;  
  524.   
  525.     int arrayA[]={3,4,5,6,7,8,9};  
  526.     int arrayB[]={12,10,9,8,7,1};  
  527.     int lengthA = sizeof(arrayA)/sizeof(arrayA[0]);  
  528.     int lengthB = sizeof(arrayB)/sizeof(arrayB[0]);  
  529.     int NumK = GetKNumber(arrayA,arrayB,lengthA,lengthB,4);  
  530.     cout<<NumK<<endl;  
  531.   
  532.     char inputchar[1000]={'\0'};  
  533.     char outputchar[1000];  
  534.     cin.getline(inputchar,1000);  
  535.     int Outlength = 0;  
  536.     //CharFliter(inputchar,outputchar,&Outlength);  
  537.     StrFliter(inputchar,outputchar,&Outlength);  
  538.     for(int i=0;i<Outlength;++i)  
  539.         cout<<outputchar[i];  
  540.     cout<<endl;  
  541.     system("pause");  
  542.     return 0;  
  543. }  

转自:http://blog.csdn.net/yangmingjinqq/article/details/25104461

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值