1、有一个整数数组,请求出两两之差绝对值最小的值,
记住,只要得出最小值即可,不需要求出是哪两个数。
int num =MAXNUM;
int temp;
for( int i = 0; i < maxsize; i++ )
{
for ( int j = i + 1 ; j < maxsize; j++)
{
}
}
我们可以看一下上面的复杂度:应该是:1+2+…+(maxsize-1),所以是O(n^2 );
但是if我们先排序一下(优化算法可以用STL的nth_element处理),然后只要遍历一次,两两比较就可以了!
CODE:
int num = MAXNUM;
int temp;
nth_element( a, a + mid, a + maxsize);
for( int
{
}
可以知道:nth_element的时间复杂度是<O(n^2)的,后面的for也就是O(n),所以整体放入复杂度就是接近O(n),所以效率更高!
2、写一个函数,检查字符是否是整数,如果是,返回其整数值。
(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
(1).
#include <stdio.h>
#include <math.h>
#include <string.h>
int main()
{
end:
}
( 2 ).
long
{
for( int i = 0; i < strlen( str);
num += ( long )( pow( strlen( str ) – 1 - i ) * ( int )(str[i] – ‘0’ ) );
return num;
}
3、给出一个函数来输出一个字符串的所有排列。( 全排列 )
#include <stdio.h>
#include <string.h>
void swapElem( char * c1, char * c2)
{
}
void permSort( char str[], int maxsize, int startIndex)
{
}
int main()
{
}
4、请编写实现malloc()内存分配函数功能一样的代码。
给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。
5、怎样编写一个程序,把一个有序整数数组放到二叉树中?( 采用递归方法 )
pTree
void
{
{
}
int
t->value = a[mid];
if( mid – 1 >= low )
{
putInBinTree( a, low, mid – 1, t->lChild);
}
if( mid + 1 <= high )
{
putInBinTree( a, mid + 1, high , t->rChild);
}
6、怎样从顶部开始逐层打印二叉树结点数据?请编程。
//!
treeNode
int head = 0;
int tail = 1;
queue[tail++] = rootTree;
while( !queue.isEmpty())
{
{
{
queue[tail++] = queue[head]->rChild;
}
}
7、怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?
当然对于此题来说:我的思路是我们需要一个栈空间来做temp,然后出栈就倒置了,呵呵~
例如现在有一个链表pLinkList
void
{
linkList
{
}
ls->next = head;
While( top >= 0 )
{
}
}
>>>当然我现在又想到另一种方法,就是不需要额外的栈空间的,利用链表插入法:遍历每个元素都往头head后面插入,那么完成后就是倒置的了,呵呵~~~
pLinkList newHead = NULL;
pLinkList head = ls->next;
while( head != NULL )
{
}
//!那么最后 newHead 就是倒置的链表咯
8、请编写能直接实现int atoi(const char * pstr)函数功能的代码。
int
{
}
9、编程实现两个正整数的除法 编程实现两个正整数的除法,当然不能用除法操作符。
//! 这一题有问题!希望有好解! unsigned int div (unsigned int a, unsigned int b)
{
int i;
unsigned int m = 0;
for (i = 1; i <= 32; i++)
{
m = (m << 1) | (a >> 31);
a = a << 1;
if (m >= b)
{
m = m - b;
a = a + 1;
}
}
return a;
}
10、在排序数组中,找出给定数字的出现次数
比如 [1, 2, 2, 2, 3] 中2的出现次数是3次。
//! 我的思路是当然先要二分法找到此数在处理(我们知道在排序好的查找元素二分法最快 )
int
{
}
11、平面上N个点,每两个点都确定一条直线,
求出斜率最大的那条直线所通过的两个点(斜率不存在的情况不考虑)。时间效率越高越好。
斜率公式是:k = (y2 – y1) / (x2 – x1);
我的思路是:先按照X将所有的point进行排序,然后对他们进行遍历,由于数学上有讲过-àif排序为A,B,C那么AB和BC中必然有一个比AC斜率大,一个比他小,所以需要进行计算,然后遍历推进直到点结束,最后找到最大!不知道还有么有更好的办法(此办法不能保证是百分百正确,只是自己的想法而已、、、 )
首先我们假设已经有了point的结构体:
typedef
{
}point;
point
void
{
{
}
else
{
}
}
}
12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。
请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
注意:
- 5个数值允许是乱序的。比如: 8 7 5 0 6
- 0可以通配任意数值。比如:8 7 5 0 6 中的0可以通配成9或者4
- 0可以多次出现。
- 复杂度如果是O(n2)则不得分。
>>>我们将题目简化为:有一个5元素的数组,比较是否相邻(当然要满足上面的条件! )
CODE:
基本思想:先将它们从小到大排序,我们只对于非0的元素进行判断,因为0可以代表任何元素!那么返回false的条件是:有重复的数;非0元素之间的最大差值已经超过4了!然后就都是可以的!时间复杂度是O( nlog(n) )
操作方法是:把他们正确的放进数组b中,if不满足上面条件的是放不进去得!相当于第一个非0元素是一个标准,然后后面的非0元素的放入是值想减放到指定的空间,if空间不满足,那么就是返回false!
bool judgeFun( int num[], int size)
{
//! 说明此处已经有了元素进入,那么也就是说有重复元素,所以不可能是相邻的呗!
}
13、设计一个算法,找出二叉树上任意两个结点的最近共同父结点。
复杂度如果是O(n2)则不得分。
我的思路:
CODE略!
14、一棵排序二叉树,令 f=(最大值+最小值)/2,
设计一个算法,找出距离f值最近、大于f值的结点。
复杂度如果是O(n2)则不得分。
//!
//!
//!前面找f的过程很简单,就省略,传递参数f过去
//! 下面就是递归找合适的元素!
Node
{
}
return
}
else
{
}
return
}
}
15、一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。
设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。
复杂度最好是O(n),如果是O(n2)则不得分。
//! 首先我们还是要排序呀!
//!然后我的想法是,设置一个low和一个high的标号分别从第一位和最后以为开始靠拢性遍历,以low位数为基准(当然以高位也是一样的),寻找符合N+1条件匹配的high数,我们知道,既然是排序(从小到大 )的,if
CODE:
void
{
{
}
while( num[low] + num[high] < N + 1&& low < high)
//! 说明low元素是没有可以匹配的
{
}
if( num[low] + num[high] == N + 1
{
}
}
}