额,第一次面试题目很简单,但是,自己由于在纸上写代码很不习惯,所以做得一沓糊涂。现在把题目公布如下,自己写的代码也附上。然后,把关于第一次笔试考到的相关知识整理一下。呵呵,偶很笨,但是,不能笨到在同一个地方摔倒两次。
1、 给定排好序的数组A(从小到大),大小为n,现在给定数X,插入到给定的数组A中,保持排序(二分法)。
额,这个题目如此之简单......以至于偶当时没有完全做出来......早知如此,在写插入排序的时候插入一个元素就要使用二分插入的......嗯,不多说了,看我后来写的代码吧。
const int MAX = 100;
int cmp(const void *a, const void *b)
{
return *(int *)a - *(int *)b;
}
/*对于有n个数的数组a[],在位置pos插入数X*/
void insert(int a[], int n, int pos, int X)
{
printf("pos = %d/n", pos);
int i;
for(i=n-1; i>=pos; --i)
a[i+1] = a[i];
a[pos] = X;
}
/*二分查找插入的位置*/
int Binary(int a[], int n, int X)
{
int begin = 0, end = n, middle;
while(begin <= end)
{
middle = (begin + end)/2;
if(a[middle] > X)
{
end = middle - 1;
}
else if(a[middle] < X)
{
begin = middle + 1;
}
else
{
return middle;
}
}
return middle;
}
void print(int a[], int n)
{
int i;
for(i=0; i<n; ++i)
printf("%d ", a[i]);
printf("/n");
}
int main()
{
// freopen("in.txt", "r", stdin);
int i, n, a[MAX], insertNum;
while(scanf("%d", &n) != EOF)//数组的个数
{
for(i=0; i<n; ++i)//输入n个数
scanf("%d", &a[i]);
qsort(a, n, sizeof(a[0]), cmp);//对输入的n个数调用库函数排序
scanf("%d", &insertNum);//输入需要插入的数字
int pos = Binary(a, n, insertNum);//二分查找插入的位置
insert(a, n, pos, insertNum);//插入
print(a, n+1);
}
return 0;
}
2、写一个栈的实现,并将1-10入栈和出栈。
额,这个更无语……就是考栈的知识,话说偶以前写过栈的,但忘记了……甚是郁闷……
typedef int ElementType;
struct stack
{
int top;
ElementType *element;
int MaxSize;
};
typedef struct stack Stack;
void Init(Stack *S,int sz)//初始化栈
{
if(sz>0)
{
S->top = -1;
S->MaxSize = sz;
S->element = new ElementType[S->MaxSize];
}
}
bool IsFull(Stack *S)//判断栈是否为满
{
return (S->top == S->MaxSize-1);
}
bool IsEmpty(Stack *S)//判断栈是否为空
{
return (-1 == S->top);
}
void Push(Stack *S, ElementType x)//进栈
{
if(!IsFull(S))
S->element[ ++S->top ] = x;
}
ElementType Pop(Stack *S)//出栈
{
if(!IsEmpty(S))
return S->element[S->top--];
else
{
return -1;
}
}
ElementType GetTop(Stack *S)//得到栈顶元素
{
if(!IsEmpty(S))
return S->element[S->top];
else
{
return -1;
}
}
void MakeEmpty(Stack *S)//栈置空
{
S->top = -1;
}
void Free(Stack *S)//释放栈
{
delete S;
}
int main()
{
int i;
Stack *S = new Stack;
Init(S,100);//初始化栈
for(i=1; i<=10; ++i)
Push(S, i);//按照1~10的顺序进栈;
while(!IsEmpty(S))
{
cout<<Pop(S)<<" ";//出栈
}
cout<<endl;
Free(S);
return 0;
}
3、编写一个函数,要求输入年月日时分秒,输出此事件的下一秒。
额……这个题目偶本来想写一个经过n秒之后的代码的,但感觉考虑细节比较多,先实现增加1秒的代码。
int monthDays[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int year, month, day, hour, minute, sec;
int isLeapYear(int year)
{
if ((0 == year%400 ) || (0 != year%100) && (0 == year%4))
return 1;
else
return 0;
}
void addSecond(int increaseSec)
{
sec += increaseSec;
if(isLeapYear(year))
monthDays[2] += 1;
if(sec>59)
{
sec = 0;
minute += 1;
if(minute>59)
{
minute = 0;
hour += 1;
if(hour>23)
{
hour = 0;
day += 1;
if(day>monthDays[month])
{
day = 1;
month += 1;
if(month>12)
{
month = 1;
year += 1;
}
}
}
}
}
monthDays[2] = 28;//一定要把二月份记得重置为28天
}
void print()
{
printf("%d年%d月%d日%d时%d分%d秒/n", year, month, day, hour, minute, sec);
}
int main()
{
while(6 == scanf("%d %d %d %d %d %d", &year, &month, &day, &hour, &minute, &sec))
{
printf("你当前输入的时间是:");
print();
addSecond(1);
printf("增加1秒后的时间是:");
print();
}
return 0;
}
4、记录如下
2005-05-09 胜
2005-05-09 胜
2005-05-09 负
2005-05-09 负
2005-05-10 胜
2005-05-10 负
2005-05-10 负
如果要生成下列结果,该如何写sql语句?
胜 负
2005-05-10 2 2
2005-05-10 1 2
果断鄙视一下自己,完全不会。好吧......那就从今天开始学数据库吧......
好吧,把这次面试考到的知识总结一下。
第一个题目,关于二分思想的知识。
额,二分思想最早我是见于在一个有序列表中查找一个数字。果断百度之,贴二分查找的优缺点。
二分查找法的优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
好吧,偶贴偶写的二分查找的代码。不要二分查找的代码很容易些……先自己写一个……然后,通过数组中的所有数字的时候你就可以说很容易写了。
int binarySearch(int a[], int n, int num)
{
int begin = 0, end = n-1, middle;
while(begin<=end)
{
middle = begin+ (end - begin) / 2;// 写成(begin+end)/2 可能会整数溢出
if(a[middle]<num)
{
begin = middle+1;
}
else if(a[middle]>num)
{
end = middle-1;
}
else
{
return middle;
}
}
return -1;
}
int main()
{
int a[] = {1, 3, 4, 5, 7, 9, 12, 23, 34, 45, 67, 88};
int n = sizeof(a)/sizeof(a[0]), num;
while(cin>>num)
{
int pos = binarySearch(a, n, num);
if(-1 == pos)
cout<<"The num can't find int the arrary/n";
else
cout<<num<<" int the array is the "<<pos+1<<" postion/n";
}
return 0;
}