常见C语言面试题之六:数组逆序
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void foo1(char* a)
{
int len = strlen(a);
for(int i=0;i
{
a[len] =
a[i];
a[i] =
a[len-i-1];
a[len-i-1] =
a[len];
}
a[len]='/0';
}
void foo2(char* a)
{
int len = strlen(a);
for(int
i=0;i
{
char
temp;
temp =
a[i];
a[i]=
a[len-i-1];
a[len-i-1] =
temp;
}
}
void foo3(char* a)
{
int len = strlen(a);
for(int i=0;i
{
a[len-i-1]
^=a[i];
a[i] ^=
a[len-i-1];
a[len-i-1]
^=a[i];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char* a = "abcd";
char* b = "abcde";
char* c = "abcdef";
foo1(a);
foo2(b);
foo3(c);
printf("%s/n%s/n%s/n",a, b,
c);
}
常见C语言面试题之七:杨辉三角
int _tmain(int argc, _TCHAR* argv[])
{
int
i,j,a[10][10]; //i表示行,j表示列
for(i=0;i<10;i++) //首先将行列都赋值为0
for(j=0;j<10;j++)
a[i][j]=0;
for(i=0;i<10;i++) //将没一行的头尾赋值为1
{
a[i][0]=1;
a[i][i]=1;
}
常见C语言面试题之八:数组实现大数阶乘
#include "stdafx.h"
#include
using std::cout;
using std::cin;
using std::endl;
void factorial(int x){
int
re[1000],len=1,i,carry;
re[0]=1; //初始re[0]赋值1
for(int
mul=2;mul<=x;mul++){ //阶乘从2开始循环
for(i=0;i
carry=0; //进位值
for(i=0;i
re[i]+=carry;
carry=re[i]/10;
re[i]%=10;
}
while(carry>0){ //最高位进位
re[len++]=carry;
carry/=10;
}
}
for(i=len-1;i>=0;i--)
cout<
cout<
}
int _tmain(int argc, _TCHAR* argv[])
{
factorial(100);
return
0;
}
//从第二行开始除最后一个数与第一个数外,
//每个数都是其所在行的前一行同一列与前一列之和
for(i=2;i<10;i++) for(j=1;j
a[i][j]=a[i-1][j-1]+a[i-1][j]; printf("**************/n");
for(i=0;i<10;i++)
{
for(j=0;j
printf("]",a[i][j]);
printf("/n");
}
return
0;
}
//0: 1
//1: 1 1
//2: 1 2 1
//3: 1 3 3 1
//4: 1 4 6 4 1
//5: 1 5 10
10 5 1
//……
常见C语言面试题之九:链表逆序
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
typedef struct List
{
int data;
struct List *next;
}List;
List* list_Create(void)
{
List *head, *tail, *p;
int e;
head = (List*)malloc(sizeof(List));
tail = head;
printf("/nList Create, input Num(end of
0):");
scanf("%d",&e);
while(e)
{
p=(List*)malloc(sizeof(List));
p->data=e;
tail->next=p;
tail=p;
scanf("%d",&e);
}
tail->next = NULL;
return head;
}
List *list_reverse(List *head)
{
List *p,*q,*r;
p=head;
q=p->next;
while(q!=NULL)
{
r =
q->next;
q->next=p;
p=q;
q=r;
}
head->next = NULL;
head=p;
return head;
}
int _tmain(int argc, _TCHAR* argv[])
{
List *head,
*p;
int d;
head=list_Create();
printf("/n");
for(p=head->next;p!=NULL;p=p->next)
printf("--%d--",p->data);
head = list_reverse(head);
printf("/n");
for(p=head;p->next!=NULL;p=p->next)
printf("--%d--",p->data);
return 0;
}
常见C语言面试题之十:有序表合并
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
typedef struct LNode
{
int data;
LNode* next;
}LNode, *LinkList;
LinkList La, Lb, Lc;
LNode* Create()
{
LinkList l, p, q;
int x;
l=NULL;
l=(LNode*)malloc(sizeof(LNode));
if(l==NULL) exit(-1); l->next =
NULL; scanf("%d", &x);
while(x!=9999)
{
p=(LNode*)malloc(sizeof(LNode));
p->data = x;
if((l->next)==NULL)
{
l->next = p;
q=p;
}
else
{
q->next = p;
q=p;
}
scanf("%d",&x);
}
p->next = NULL;
return (l); }
void print_LinkList(LinkList l)
{
LinkList p;
p=l;
printf("---");
while(p->next!=NULL)
{
p =
p->next;
printf("]",p->data);
}
printf("/n/n");
}
LinkList MergeList(LinkList La, LinkList Lb)
{
LinkList pa, pb, pc;
pa = La->next;
pb = Lb->next;
Lc = pc = La;
while(pa &&
pb)
{
if(pa->data<=pb->data)
{
pc->next = pa;
pc = pa;
pa = pa->next;
}
else
{
pc->next = pb;
pc=pb;
pb = pb->next;
} }
pc->next = pa?pa:pb;
free(Lb);
return(Lc);
}
int _tmain(int argc, _TCHAR* argv[])
{
La =
Create();
Lb = Create();
MergeList(La,Lb);
print_LinkList(Lc);
return 0;
}
常见C语言面试题之十一:约瑟夫环
#include "stdafx.h"
#include
#include
typedef struct node
{
int data;
struct node* next;
}LNode;
LNode* Create(int n, int k) //创建循环链表
{
int start=k-1;
if(start==0) start = n;
LNode *s, *p, *L=NULL, *t;
while(n!=0)
{
s =
(LNode*)malloc(sizeof(LNode));
if(L==NULL)
p=s;
if(n==start)
t=s;
s->data = n;
s->next = L;
L=s;
n--;
}
p->next = L;
return t;
}
LNode* GetNode(LNode *p)
{
LNode *q;
for(q=p;q->next!=p;q=q->next);
q->next =
p->next;
free (p);
return (q);
}
int Print(LNode *p, int m)
{
int i;
printf("出队编号:/n");
while(p->next!=p)
{
for(i=1;i<=m;i++)
{
p=p->next;
}
printf("=",p->data);
p =
GetNode(p);
}
printf("=/n", p->data);
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
LNode
*p;
int n,k,m;
do
{
printf("输入总人数:");
scanf("%d",&n);
}while(n<0);
do
{
printf("输入开始人的序号1~%d:",n);
scanf("%d",&k);
}while(k<=0||k>n);
do
{
printf("输入间隔数字:");
scanf("%d",&m);
}while(m<=0);
p=Create(n,k);
Print(p,m);
return 0;
}
华为的部分面试题
==========================
本节摘抄自“海边的卡夫卡”:
两道编程,一道是在一个串里面删除从i到j之间的一段,还有就是求一个数是否是对称数(付源码)。
循环 除10,商除10,余数乘10, 判断结果 int print_num(int num) { int over = 0; int quotient = 0; quotient = num; while(1) { over = over*10 + quotient ; quotient=quotient/10; if ( quotient == 0 ) break; } printf("num = /n",num); printf("over = /n",over);