第一周面试题

1.有一个整形数组:int arr[](数组的值由外部输入决定),一个整型变量:x(也由外部输入决定)。

要求:
1)删除数组中与x的值相等的元素

2)不得创建新的数组
3)最多只允许使用单层循环
4)无需考虑超出新数组长度后面的元素,所以,请返回新数组的长度

例如:{1,2,3,5,7,3,5,9)x=3
原数组的有效部分变为:{1,2,5,7,5,9}

 方法一:

#include<myhead.h>

int main(int argc, const char *argv[])
{
	int x;
	printf("请输入x:");
	scanf("%d",&x);
	int n;
	printf("请输入n:");
	scanf("%d",&n);
	int arr[n];
	for(int i=0;i<n;i++)
	{
		scanf("%d",&arr[i]);
	}
	int index_x=0;
	int index_d=0;
	while(index_x < n)
	{
		if(arr[index_x] != x)
		{
			index_x++;
			continue;
		}
		if(index_d <= index_x)
		{
			index_d = index_x;
		}
		if(arr[index_d] == x)
		{
			index_d++;
			continue;
		}
		arr[index_x] ^= arr[index_d];
		arr[index_d] ^= arr[index_x];
		arr[index_x] ^= arr[index_d];
		index_x = index_d;
	}
	int i = 0;
	int len = 0;
	while(arr[i] != x)
	{
		printf("%d ",arr[i++]);
		len++;
	}
	puts("");
	printf("len = %d",len);
	
	

	return 0;
}

 方法二:

int removeElement(int arr[], int n, int x)
{
    int j = 0;
    for (int i = 0; i < n; i++)
    {
        if (arr[i] != x)
        {
            arr[j] = arr[i];
            j++;
        }
    }
    return j;
}

 方法三:

#include<myhead.h>

int main(int argc, const char *argv[])
{
	int arr[]={1,2,3,4,3,5,3,6};
	int k = 0;
	int j = 0;
	int len = sizeof(arr)/sizeof(arr[0]);
	/*
	for(i=0;i<len;i++)
	{
		if(arr[i] != 3)
		{
			arr[j++] = arr[i];
		}
	}
	for(i=0;i<j;i++)
	{
		printf("%d ",arr[i]);
	}
	*/
	for(int i =0;i<len;i++)
	{
		if(arr[j] != 3)
		{
			if(arr[j] != arr[k])
			{
				arr[j] ^= arr[k];
				arr[k] ^= arr[j];
				arr[j] ^= arr[k];
			}
			j++;
			k++;
		}
		else if(arr[j] == 3)
		{
			j++;
		}
	}
	for(int i=0;i<k;i++)
	{
		printf("%d ",arr[i]);
	}
	return 0;
}

 

 

2.写递归函数 DigitSum(n),输入一个非负整数,返回组成它的数字之和例如:调用DigitSum(1729),则返回1+7+2+9,它的和是19;输入1729,输出19

#include<myhead.h>
int add_size(int num)
{
	if(num==0)
	{
		return 0;
	}
	return num%10 + add_size(num/10);
}


int main(int argc, const char *argv[])
{
	int num;
	scanf("%d",&num);
	int num_add = add_size(num);

	printf("%d\n",num_add);

	return 0;
}

3.写一个宏,可以将一个int型整数的二进制位的奇数位和偶数位交换
 

#include<myhead.h>

#define exchange(num) ({\
		((num&0xaaaaaaaa)>>1) + ((num&0x55555555)<<1);\
		})

int main(int argc, const char *argv[])
{
	int num;
	printf("请输入num:");

	scanf("%d",&num);

	int num_t=exchange(num);

	printf("转换后的数为:%d\n",num_t);
	return 0;
}

 4.字符串倒置:(注意:是倒置,而不是直接倒置输出)

原字符串为:char *str =“I am Chinese”
倒置后为:“Chinese am I”.
附加要求:删除原本字符串中多余的空格

#include<myhead.h>

void swap(char* str, int front, int rear)
{
	while(front < rear)
	{
		*(str+front) ^= *(str+rear);
		*(str+rear) ^= *(str+front);
		*(str+front) ^= *(str+rear);
		front++;
		rear--;
	}
}


int main(int argc, const char *argv[])
{
	char str[100]="l      love       you";
	int front = 0;
	int rear = 0;
	//去空格
	int i = 0;
	int j = 0;
	int len = strlen(str);
	for(i=0;i < len;i++)
	{
		if(str[i] == ' ' && str[i+1] == ' ')
			continue;
		str[j++] = str[i];
	}
	str[j] = '\0';
	
	printf("转换为%s\n",str);

	rear = strlen(str)-1;
	//整个转化
	swap(str,front,rear);
	printf("转换为%s\n",str);

	i = 0;
	j = 0;
	while(str[i] != '\0')
	{
		//找头
		while(str[i] == ' ')
		{
			i++;
		}
		j = i;
		//找尾
		while(str[j] != ' ' && str[j] != '\0')
		{
			j++;
		}
		swap(str,i,j-1);
		i = j;
	}

	printf("转换为%s\n",str);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值