面试编程题---其中隐藏着若干0,其余非0整数,使A把0移至后面,非0整数移至数组前面并保持有序

题目:int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路) 


这是今天看到的一到面试编程题,题目算是简单一些,读完题目至少在思路还编码上还是比较有把握的,不借助辅助空间这一点没问题,考虑效率这个就要用到一个巧字了,一般这个我是想不到的,所以这次我先尝试自己把代码写出来然后看看人家是怎么写的,对比着看,这样可以修炼提升自己的内力!


我自己编的测试程序:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int Func(int * A, int nSize);
int Swap(int* a, int* b);
int InsertSort(int * array, int size); 

int main(void) 
{ 
	int i; 
	int A[13] = {4, 1, 0, 6, 0, 9, 2, 0, 0, 3, 8, 5, 7};
	//int A1[13] = {0, 1, 0, 6, 0, 9, 2, 0, 0, 3, 0, 0, 0};
	int pos = -1;
	
	printf("A[]: ");
	for(i = 0; i < 13; i++)
	{
		printf(" %d, ", A[i]);
	}
	printf("\n");
	
	pos = Func(A, 13);
	
	printf("A[]: ");
	for(i = 0; i < 13; i++)
	{
		printf(" %d, ", A[i]);
	}
	printf("\n");
	
	printf("pos = %d\n", pos);
	
	system("pause");
    return 0;
} 

int Func(int * A, int nSize)
{
	int ret = -1;
	int i = 0; /* 表示第一个元素的下标 */
	int j = nSize - 1; /* 表示最后一个元素的下标 */
	static flag = 1;
	
	ret = (A != NULL) && (nSize > 0);
	
	if(ret)
	{
		//1. 首先判断第一个元素是否为0
		while(A[i] == 0)
		{
			ret = i;
			Swap(&A[i], &A[j--]);//交换a[i] a[j]的值 直到a[0]位置不为0 
		} 
		
		while( i != j)//第一个元素不为0 
		{
			i++;
			if(A[i] == 0)
			{	
				if(flag == 1)//标记第一次出现0的位置 
				{
					ret = i;
					flag = 0;
				}
				//如果下一个元素为0则先交换
				while(A[i] == 0)
				{
					Swap(&A[i], &A[j--]);//交换a[i] a[j]的值 直到a[0]位置不为0 
				} 
			}
			
			InsertSort(A, i+1);//对前面的数字进行插入排序
			 	    
		}
	}
	
	return ret;
}

int InsertSort(int * a, int size)
{
	int ret = -1;
	int i = 0, j = 0;
	int Temp = 0;
	
	ret = (a != NULL) && (size > 0);
	
	if(ret)
	{
		//插入排序 
		for(i = 1; i < size; i++)
		{
			if( a[i-1] > a[i] )
			{
				Temp = a[i];
				
				for(j = i - 1; (j >= 0) && (Temp < a[j]); j-- )
				{
					a[j+1] = a[j];//向后挪 
				}
				
				a[j+1] = Temp;
			}
			
		}
	}
	
	
	return ret;
}    

int Swap(int* a, int* b)
{
	int ret = -1;
	int c = 0;
	ret = (a != NULL) && (b != NULL);
	
	if(ret)
	{
		c = *a;
		*a = *b;
		*b = c;
	}
	
	return ret;
}

运行效果截图:


上面的编程思路完全是满足题目要求,不过总觉得效率问题总有点欠缺!比如排序用的是插入排序,那个地方绝对可以做个优化!

刚看了别人写的!居然不用排序!题目中保持有序也不知道到底用不用排序!难道是我理解错了???而且用的插入排序也是稳定排序!算是复习了下插入排序吧!



智能网联汽车的安全员高级考试涉及多个方的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是对该主题的一些核心知识点解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的成与功能 智能网联车常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些备协同工作以环境感知、障碍物检测等功能[^2]。 #### 3. 信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“橙点同学”作为特定平台上的学习资源名称,不提供官方认证的标准答案集;建议过正规渠道获取教材参加培训课程来准备此类资格认证考试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值