嵌入式软开面试常见的手写代码

1、冒泡排序:

void BubbleSort(int arr[], int len)
{
	for (int i = 0; i < len-1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (arr[j] > arr[j+1])
			{
				Swap(&arr[j], &arr[j+1]);
			}
		}
	}
}

2、字符串拷贝函数strcpy实现:

char * strcpy(char * dest,const char * src)
{
	if((dest==NULL) || (src==NULL))
		return NULL;
		
	char * tmpdest=dest;//保存目标字符串首地址
	const char * tmpsrc=src;
	while((*tmpdest++ = *tmpsrc++) != '\0');//把src地址开始的字符串复制到dest开始的字符串中
		return dest;//返回目标字符串的地址
}

3、反转字符串strcpy实现:

char *revstr(char* str)
{
	char *start=str;//start指向字符串的开始位置
	char *end=str+strlen(str)-1;//end指向字符串的结束位置
	char tmp;

	if(str != NULL)
	{
		while(start < end)//字符串是奇数时候,start会出现等于end,该位置不用交换
		{
			tmp = *start;
			*start++ = *end;//*start++,它的运算顺序是先返回 *start的值,然后start再++。
			*end-- = tmp;//*end--,它的运算顺序是先返回 *end的值,然后end再--。
		}
		return start;
	}	
}

4、判断内存存储大端小端的程序:

int function()
{
	union test
	{
		int i;
		char c;
	}tt; //定义一个有两个数据项的联合体,特征就是任何一个元素均是从联合体的基地址开始存储或保存
	tt.i=1;
	return (tt.c==1);//返回真则为小端模式,返回假则为大端模式
}

5、要求输入一个整数n,(n<=39) ,请你输出斐波那契数列(1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946…)的第n项(从0开始,第0项为0):

//递归版:
int Fib(int n)
{
	if (n<=0)
		return 0;
	else if (n==1 || n==2)
		return 1;
	else
		return Fib(n-1)+Fib(n-2);  
}
//动态规划版:
int Fib(int n)
{
	if(n <=0 )
		return 0;
	int first=1;
	int second=1;
	while(--n > 1)
	{
		second=first+second;
		first=second-first;
	}
	return second;
}

6、设置绝对地址0x45a8的整形变量的值为0x55aa:

int* p;
p=(int *)0x45a8;
*p=0x55aa;

7、实现函数,输入一个整数,输出该二进制表示中1的个数,例如,把9表示成二进制是1001,有2位是1,因此输出是2:

//思路:把一个整数减1,将得到的整数与原来的整数做 位与 运算,会把该整数最右边的1变成0,
//依次循环,直到整数中所有的1变成0循环结束。则循环执行的次数就是该整数的二进制数中包含的1的个数。
//如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,
//原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
//例如:10010000 ----> 10001111
int Numberof1(int n)
{
    int count=0;
    while(n!=0)
    {
        ++count;
        n = n & (n-1);
    }
    return count;
}

8、从键盘输入一个4位数正整数a,使用int进行存储,将该数反序输出到另一个int型变量b中(过程中不使用字符串操作)。例如,若输入的是1357,则输出的是7531。

#include
void main()
{
	int a, b = 0;
	printf("请输入一个四位整数:");
	scanf("%d", &a);
	while (a)
	{
		b *= 10;//每次将b乘以10     0,7,70,750,7530
		b += a % 10;//对输入数取余数,即最后一个数7,将该数与输出数相加,b的第一个数是7,75,753,7531
		a /= 10;//取余后,将输入数除以10取整数,即拿到去掉最后一个数的数字135,13,1,0
	}
	printf("倒序后为:%d\n", b);
	system("pause");
}

9、遍历单链表中确定值最大的点

int GetMax(LinkList L)
{
	if(L->next == NULL)
		return NULL;
	LNode *pmax,*p;
	pmax=L->next;//假定第一个节点中数据最大
	p=L->next->next;
	while(p)
	{
		if(p->data > pmax->data)
		pmax=p;//若p值大于max值,则重新赋值
		p=p->next;//遍历链表
	}
	return pmax->data;
}

你可能感兴趣的:(学习随笔)