2012年华为校园招聘机试(南京)


1:给定一个整数(有可能是负数),将整数变成字符串。函数已经声明好类似void change(int number, char s[])的形式。可以自己写用例测试

解:基础题目

解法一

void change(int number, char s[])
{
 itoa(number,s,10);
}

解法二

void change(int number, char s[])
{
 //以十进制转换
    int tmp=number,index=0,count=0;//用来计算number的位数
 while(tmp!=0)
    tmp=tmp/10,++count;//注意此处用了逗号表达式
 number>0?true:(s[0]='-',++index);
 s[count+index]='\0';
 for(;count;s[index+(--count)]=abs(number)%10+48,number/=10);//要加48:)
}

2:给定一个已经定义好的单链表,将单链表中的数字逆序。输入为head指针,返回的也是一个head指针。函数声明为void sor(Node **head)的形式。
 
解,链接的逆转算法

void sor(Node **head)
 {
    Node *p=*head,*q,*s;
    if(!p||!p->next)//head=NULL,或者只有一个元素返回
        return ;
    q=NULL;
    s=p->next;
    while(s)
    {
        p->next=q;
        q=p;
        p=s;
        s=s->next;
    }
  p->next=q;
    *head=p;
 }

3:有一个数组a[N]如a[10]={0,1,2,3,4,5,6,7,8,9}每隔两个数删除一个数,如0,1,2(删除),3,4,5(删除),6,7,8(删除),9,到数组尾部回到数组头部继续删除,要求编写一个函数实现实现上述操作,返回最后一个数的数组下标。函数接口:int getLast(int iLen),参数:数组初始元素个数iLen

解:基本算法

int getLast(int iLen)
 {
    int *data=new int[iLen];
    for(int i=0;i<iLen;i++)
        cin>>data[i];
    int cnt=iLen,index=0,flag=1,last;
    while(cnt>1)
    {
        ++index;
        if(data[index%iLen]!=-1)
        {
    ++flag;
  }
        if(flag==3)
        {
            data[index%iLen]=-1;
            flag=0;
            --cnt;//将数组无数减1
        }
    }
    for(int j=0;j<iLen;j++)//这种方法效率不高,要再一次循环,求坐标
        if(data[j]!=-1)
            last=j;
    return last;
 }

相关内容