zoukankan      html  css  js  c++  java
  • 华为机考2

    #include <iostream>
    using namespace std;
    void func(int *p, int n, int k);
    void main()
    {
        int a[]={1,2,3,4,5};
        int i;
        func(a,5,2);
    
        for(i=0;i<5;i++)
        cout<<a[i]<<" ";
        cout<<endl;
    }
    void func(int *p ,int n, int k)
    {   
        int temp;
        int i;
        k=k%n;
    //n是总长度,k是移位位数,实际移位k%n
        if(k>=0)//右移
        {
                while(k)
            {
                temp=p[n-1];
                for(i=n-1;i>0;i--)
                    p[i]=p[i-1];
                p[0]=temp;
                k--;
            //临时数组存放最后一个数据,然后依次后移,k--;
            }
        }
        else if(k<0)
        {
            k=k*(-1);//左移
        while(k)
            {
                temp=p[0];
                for(i=1;i<n;i++)
                    p[i-1]=p[i];
                p[n-1]=temp;
                k--;
    //临时数组存放第一个数据
            }
        }
    }
    View Code

    7、数组循环移位

    10.将字符串中的所有字母都替换成该字母的下一个字母

    #include <iostream>
    using namespace std;
    #include <ctype.h>
    #include <stdio.h>
    #include <string.h>
    
    void func(char *p);
    void main()
    {
        char str1[20];
        printf("enter:");
        gets(str1);
        func(str1);
        puts(str1);
       
    }
    void func(char *p)
    {
        char ch;
        while(*p)
        {   ch=*p;//临时字符
        
    //判断是否是字符,且不是z或者Z
        if(isalpha(*p)&&(*p!='z')&&(*p!='Z'))、、
                *p=ch+1;
            else if(*p='z')
                *p='a';
            else if(*p='Z')
                *p='A';
            p++;
    
        }
    }

    回文判断

    #include<iostream>
    using namespace std;
    
    bool func(int m);
    void main()
    {
        int m;
        cout<<"enter a number:"<<endl;
        cin>>m;
        cout<<func(m)<<endl;
    }
    bool func(int m)
    { 
        int i,n=0;
        i=m;
        
       while(i)
       {
           n=n*10+i%10;
           i/=10;
      }
    //就是把原数的位从低到高取出来,组成新数,两个数搞出来看看是否相等。。
       if(m==n) 
           return true;
       return false;
    }
    View Code


    字符串转成整数

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    int func(char a[]);
    void main()
    { 
        char a[]={'1','2','3','4',''};
        
        cout<<func(a)<<endl;
        
    }
    int func(char a[])
    {
        int i=0;
        int sum=0;
        while(a[i]!='')
        {
            sum=sum*10+(a[i]-'0');
            i++;
        }
            
        return sum;
    }
    View Code

    下面就说说为什么字符减'0'可以到相应的整数。现在比如我们要字符‘1’转换成数字1,就这么一个变化,我们看到了大家注意了字符型常量用''括起来的原因是,它们在计算机中都以各自的ASCII表示。而‘1’的对应编码是49的二进制码,但是我们的数字1,就等于1呀,所以为了由原来的‘1’实际上就是49的二进制变成现在的1对应的二进制1,只好用49-48=1了。但是在ASCII码里‘0’对应的刚好是48的二进制码,所以我们转换的时候只需要‘1’-‘0’=1;就可以了。而数字的ASCII码是按顺序规定的。所以其它字符要转换成数字都可以用减‘0’来表示。比如‘2’的ASCII是50,而我们要得到数字2,于是用‘2’-48=2了。看来当我们知道数据在计算机中的存储规则的时候,问题就迎刃而解了。

         大小写字母的转换:先看ASCII码:a~z是97~122的二进制,而A~Z是65~90的二进制编码,于是我们就得出:大写字母=小写字母-32 ;这个公式了。当然这里的32我也可以这么写‘Z’=‘z’-'空格'。因为空格的ASCII码是32对应的二进制编码。

    #include <stdlib.h>
    #include <stdio.h>
    int main(void)
    {
      float n;
      char *str = "12345.67";
      n = atoi(str);
      printf("string = %s integer = %f
    ", str, n);
      return 0;
    }
    View Code
    #include <stdlib.h>
    #include <stdio.h>
    int main()
    {
      char a[] = "-100" ;
      char b[] = "123" ;
      int c ;
      c = atoi( a ) + atoi( b ) ;
      printf("c = %d
    ", c) ;
      return 0;
    }
    View Code

    int atoi(const char *nptr);

    参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 ) 字符时停止转换,返回整型数。否则,返回零,头文件: #include <stdlib.h>

    13.求一个二维数组每列的最小值

    #include <iostream>
    using namespace std;
    
    void fun(int input[3][4], const int m, const int n, int output[4]);
    int main()
    {
        int input[3][4] = { {21,48,86,92},
                            {10,23,12,69},
                            {46,78,49,13}};
    
        int output[4];
    
        fun(input, 3, 4, output);
    
        cout<<"原二维数组是:"<<endl;
    
        for(int i=0; i<3; i++)
        {
            for(int j=0; j<4; j++)
            {
                cout<<input[i][j]<<" ";
            }
            cout<<endl;
        }
    
        cout<<"每列最小值是:"<<endl;
    
        for (int k=0; k<4; k++)
        {
            cout<<output[k]<<" ";
        }
        cout<<endl;
    
        return 0;
    }
    
    void fun(int input[3][4], const int m, const int n, int output[4])
    {
        int i = 0;
        int j = 0;
    
        for (i=0; i<n; i++)
        {
            output[i] = input[0][i];//暂存每一列的第一行元素
            for (j=0; j<m; j++)
            {
                if (output[i] > input[j][i])
                {
                    output[i] = input[j][i];//依次比较得到每一列的最小值
                }
            }
        }
    }
    View Code

    14.连续字符统计(如AABCCCD:A2B1C3D1)

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    using namespace std;
    void func(char str[],int len);
    void main()
    {
        char str[20];
        int len;
        cout<<"enter:";
        gets(str);
        len=strlen(str);
        func(str,len);
    
    }
    void func(char str[], int len)
    { 
        int count=1;
        int i;
        for(i=0;i<len;i++)
        {
            if(str[i]==str[i+1])
                count++;
    //利用数组比较,也可用指针
           else
           {
            cout<<str[i]<<count;
            count=1;//碰到新元素。回归为0;
           }
        }
        cout<<endl;
    
    }
    View Code

    15.找出一个字符串中是否包含相同的子字符串(要求子串长度大于等于2)

    包含文件:string.h
    函数名: strstr
    函数原型:extern char *strstr(char *str1, char *str2);
    功能:从字符串str1中查找是否有字符串str2,如果有,从str1中的str2位置起,返回str1中str2起始位置的指针,如果没有,返回null。
    返回值:返回该位置的指针,如找不到,返回空指针。
    例子:
    
    char str[]="1234 xyz";
    char* str1=strstr(str,"34");
    cout<<str1<<endl;
    原型:char * strncpy(char *dest, char *src,size_tnum);
    功能:(c/c++)复制src中的内容(字符,数字、汉字....)到dest,复制多少由num的值决定,返回指向dest的指针。如果遇到null字符(''),且还没有到num个字符时,就用(num - n)(n是遇到null字符前已经有的非null字符个数)个null字符附加到destination。注意:并不是添加到destination的最后,而是紧跟着由source中复制而来的字符后面。下面举例说明[1]:
    char des[] = "Hello,i am!";
    char source[] = "abcdef";
    strncpy(des,source,5);
    此时,des区域是这样的:a,b,c,,,逗号,i,空格,a,m,!
    注意:0,并不是添加在!的后面。

    没看懂

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    
    int fun(char* str, int n)
    {
        char *temp = new char[n+2];
        char *str2 = str;
        int sum = 0;
        int outsum = 0;
        char* t;
        
        for(int i = 0; i < n; i++)
        {
            for(int j = 2; j <= n-i; j++)
            {
                sum = 0;
                str2 = str;//
                memset(temp,0,(n+2)*sizeof(char));//初始化0
                strncpy(temp, str+i, j);//
        
                while((t = strstr(str2,temp)) != NULL)
                {
                    sum++;
                    str2 = t+j;
                }
                if( sum > outsum)
                {
                     outsum = sum;
                }
            }    
        }
        if(outsum == 1)
            return 0;
        
        return outsum;
        
    }
    
    int main()
    {
        char strstr[1000];
        memset(strstr,0,sizeof(strstr));
        char *s = strstr;
        cin >> s;
        int n =strlen(s);
        int outsum;
        outsum = fun(s,n);
        cout << outsum << endl;
        
        system("pause");
        return 0;
    }
        
                
    View Code

    16.已知:yi er san si wu liu qi ba jiu 分别对应123456789,对一段只含有这几种字符的字符串进行转换,转换成相应的数字

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    char* sss[9] = {"yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};
    
    int fun(char* str)
    {
        int i;
        int sum = 0;
        int d = 0;
        i = 0;
        int j;
        
        while(str[i] != '')
        {
            if(str[i] == 'y' || str[i] == 'e'|| str[i] == 'w' || str[i] == 'q' || str[i] == 'b')
                d = 2;
            else if(str[i] == 'l' || str[i] == 'j')
                d = 3;
                else if(str[i] == 's')
                    {
                        if(str[i+1] == 'a')
                            d = 3;
                        else d = 2;
                    }
    //确定碰到字符时移动的距离d
                for(int k = 0; k < 9; k++)
                    {if(strncmp(str+i,sss[k],d) == 0)//匹配成功
                        j = k+1;//实际数字
                sum = 10*sum + j;
                }
                i = i+d;//每比较一个字符串移动的距离
                            
    //不考虑字符串不匹配的情形
        }
        return sum;
    }
    
    int main()
    {
        char strstr[1000];
        memset(strstr,0,sizeof(strstr));
        char *s = strstr;
        cin >> s;
        
        int outsum;
        outsum = fun(s);
        
        cout << outsum << endl;
        
        system("pause");
        return 0;
    }
                

    17.删除字符串中字符个数最少的字符串

    暂时没看懂

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    char* fun(char* str, int n)
    {
        int i=0;
        int j=0;
        int hash[256] = {0};
        char *result = new char[n+1];
        memset(result,0,(n+1)*sizeof(char));//开辟字符指针并初始化
        for( i = 0; i < n; i++)
        {
            hash[str[i]]++;
        }
    //每个字符的个数。用哈希值表示
        int min = 0x7fffffff;
    
        for( i = 0; i < 256; i++)
        {
            if(hash[i] < min && hash[i] != 0)
                min = hash[i];
        }
        
        for(i = 0,j = 0; i < n; i++)
        {
            if(hash[str[i]] != min)
            {
                result[j++] = str[i];
            }
        }
        
        return result;
    }
    
    int main()
    {
        char strstr[1000];
        memset(strstr,0,sizeof(strstr));
        char *s = strstr;
        cin >> s;
    
        char *re = NULL;
        
        re = fun(s,strlen(s));
        
        cout << re << endl;
        system("pause");
        return 0;
    }    
    View Code
    C:
    #include "stdio.h" //这个头文件包含gets()函数
    int main(void)
    {
    char str1[5];
    gets(str1);
    printf("%s
    ", str1);
    return 0;
    }
    C++:
    #include<iostream>
    using namespace std;
    int main()
    {
    char str[100];
    gets(str);
    cout<<str<<endl;
    return 0;
    }
    gets()函数用来从标准输入设备(键盘)读取字符串直到换行符结束,但换行符会被丢弃,然后在末尾添加'0'字符。其调用格式为:
    gets(s);
    其中s为字符串变量(字符串数组名或字符串指针)。
    gets(s)函数与scanf("%s",s)相似,但不完全相同,使用scanf("%s",s) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,但gets()函数将接收输入的整个字符串直到遇到换行为止。

    18.比较两个字符串,相等返回1,不等返回不等的位置

    #include<stdio.h> 
    #include<string.h> 
    #include<iostream>
    using namespace std;
    void func(const char *str1,const char*str2); 
    void main()
    {
        char *str1,*str2;
        str1=new char[256];
        str2=new char[256];
        memset(str1,0,256*sizeof(char));
        memset(str2,0,256*sizeof(char));
        cout<<"enter:"<<endl;
        gets(str1);
        gets(str2);//从键盘得到输入数据碰到空格不停
    //从stdin流中读取字符串,直至接受到换行符或EOF时停止,并将读取的结果存放在buffer指针所指向的字符数组中。换行符不作为读//取串的内容,读取的换行符被转换为null值,并由此来结束字符串。
        func(str1,str2);
    
    }
    void func(const char *str1,const char*str2) 
    { 
        int m,n;
        int k=0;
        int l,j;
        int i=0;
        m=strlen(str1);
        n=strlen(str2);
        while(*str1!='')
            {
                if(*str1==*str2)//||(abs(*str1-*str2)=='a'-'A'))
                {str1++;
                 str2++;
                 k++;//k是位置。
                }
                else break;
                
            }
        if(k==m&&n==m)//完全相等则为1
            cout<<"1"<<endl;
        else
            cout<<k<<endl;
    
    }
    View Code

    19.比较两个字符串是否相等,大小写也算相等

    #include<stdio.h> 
    #include<string.h> 
    #include<iostream>
    using namespace std;
    bool func(const char *str1,const char*str2); 
    void main()
    {
        char *str1,*str2;
        bool m;
        str1=new char[256];
        str2=new char[256];
        memset(str1,0,256*sizeof(char));
        memset(str2,0,256*sizeof(char));
        cout<<"enter:"<<endl;
        gets(str1);
        gets(str2);
        m=func(str1,str2);
        cout<<m<<endl;
    
    }
    bool func(const char *str1,const char*str2) 
    { 
        int m,n;
        int k=0;
        m=strlen(str1);
        n=strlen(str2);
        if(m!=n)
            return false;
        else
        {
            while(*str1!='')
            {
                if(*str1==*str2||(abs(*str1-*str2)=='a'-'A'))//大小写的处理,相减为32
                {str1++;
                 str2++;
                 k++;
                }
                else break;
                
            }
        }
    
        cout<<k<<m<<n;
    
        if(k==m)
            return true;
        else 
            return false;
    } 
    View Code

    20.将一句英文的每个单词的第一个字母大写

    #include<stdio.h> 
    #include<string.h> 
    #include<iostream>
    using namespace std;
    void func(char *ptr); 
    void main()
    {
        char *ptr; 
        ptr =new char[256]; 
        memset(ptr, 0, sizeof(ptr));  
        cout<<"please input an English sentence:"<<endl; 
        gets(ptr); 
        func(ptr);
        cout<<ptr<<endl;
    
    }
    void func(char *ptr) 
    { 
        char *ptr1; 
        ptr1=new char[256];
        memset(ptr1, 0, sizeof(ptr1)); 
        ptr1 = ptr;
        if(*ptr1<'a')
            *ptr1=*ptr1; 
        else
            *ptr1 -= 32; 
        while(*ptr1!='') 
        { 
        
            if(*ptr1==' ')
            {
                if(*(ptr1+1)<'a')
                   *(ptr1+1)=*(ptr1+1); 
               else
                   *(ptr1+1) -= 32; 
            } 
            ptr1++; 
    //空格后的第一个字符大写,减去32.
        } 
    } 
    View Code
    swap(a,b)值交换的四种方法:
    [cpp] 
    void swap(int &a, int &b)  
    {  
        //方法一:  
        int tmp = 0;  
        tmp = b;  
        b = a;  
        a = tmp;  
        //方法二:  
        //a = a+b;  
        //b = a-b;  
        //a = a -b;  
        //方法三:  
        //a ^= b ^= a ^= b;  
        //方法四:  
        //a = a+b-(b=a);  
    }  
      
    int main(void)  
    {  
        int a = 3;  
        int b = 4;  
      
        printf("before swap: a = %d, b = %d ", a, b);  
        swap(a, b);  
        printf("after swap: a = %d, b = %d ", a, b);  
      
        return 0;  
    }  
    结果:
    before swap: a = 3, b = 4
    after swap: a = 4, b = 3
     
        关于传参方式有三种:值传参、地址传参、引用传参(C++方法),上面使用的是第三种,引用传参,因为这种传参方式使得swap里面实现更为直观。当然,也可以使用第二种传参方式地址传参,不过,值传参是不行的哦。
  • 相关阅读:
    [Leetcode][动态规划] 零钱兑换
    [Linux][函数]flock函数的用法
    [Leetcode][动态规划] 买卖股票的最佳时机IV
    [C++] 类的设计(2)——拷贝控制(1)
    [C++] C++中的常用库
    Python 爬虫学习笔记2
    Python 爬虫学习笔记1
    Tableau学习笔记:join
    可视化文摘:multifaceted data and story
    可视化学习笔记8:一般设计技巧
  • 原文地址:https://www.cnblogs.com/fickleness/p/3361250.html
Copyright © 2011-2022 走看看