华为机考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','\0'};
    
    cout<<func(a)<<endl;
    
}
int func(char a[])
{
    int i=0;
    int sum=0;
    while(a[i]!='\0')
    {
        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\n", 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\n", c) ;
  return 0;
}
View Code

int atoi(const char *nptr);

 

参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零,头文件: #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字符('\0'),且还没有到num个字符时,就用(num - n)(n是遇到null字符前已经有的非null字符个数)个null字符附加到destination。注意:并不是添加到destination的最后,而是紧跟着由source中复制而来的字符后面。下面举例说明[1]:
char des[] = "Hello,i am!";
char source[] = "abc\0def";
strncpy(des,source,5);
此时,des区域是这样的:a,b,c,\0,\0,逗号,i,空格,a,m,!
注意:\0,\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] != '\0')
    {
        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\n", 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!='\0')
        {
            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!='\0')
        {
            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!='\0') 
    { 
    
        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\n", a, b);  
    swap(a, b);  
    printf("after swap: a = %d, b = %d\n", a, b);  
  
    return 0;  
}  
结果:
before swap: a = 3, b = 4
after swap: a = 4, b = 3
 
    关于传参方式有三种:值传参、地址传参、引用传参(C++方法),上面使用的是第三种,引用传参,因为这种传参方式使得swap里面实现更为直观。当然,也可以使用第二种传参方式地址传参,不过,值传参是不行的哦。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2013-10-10 14:42  夜雨阑珊  阅读(745)  评论(0编辑  收藏  举报