师兄面试总结编程部分解答之三

三、数组

1、指针数组,数组指针,指针函数,函数指针等的区别 

int *ptr[]; int (*ptr)[]; int *func(int); int (*func)(int).由于添加括号造成的优先级不同

2、连续子数组的最大和
有时间复杂度的限定,必须考虑和小于0就直接舍去(剑指offer 171页)

//看到的内容仅仅是将之前数组的最大值保留
//将当前得到最大值与 目前存储的最大值进行比较
int maxSubArray(int A[],int length)
{
	if (A == NULL || length == 0)
		return 0;
	int currentMax = A[0];//当前子数组的最大值
	int max = A[0];//子数组最大值
	for(int i = 1; i < length; i++)
	{
		currentMax = currentMax + A[i] > A[i] ? currentMax + A[i] : A[i];
		max = currentMax > max ? currentMax : max;
	}
	printf("max sub array is %d",max);
	return max;
}
3、寻找数组中出现超过一半的数字
判断下一个遍历的数字是否与之前保存的那个数字相同(剑指offer 165页)与 编程之美 上寻找“水王” 异曲同工。

//寻找数组中超过一半的数组
//删除两两不同的元素,最终剩余元素即为想要的元素
//还有没有其他的解决方案
void findNum(int numList[],int len)
{
	int record = numList[0];
	int count = 1;
	for(int i = 1; i < len;i++)
	{
		if(count == 0)
		{
			record = numList[i];
			count = 1;
			continue;
		}
		if(numList[i] != record)
		{
			count--;
		}else
		{
			count++;
		}
	}
	printf("%d\n",record);
}
4、第一次只出现一次的字符
要考虑用hash表(剑指offer 187页)

//第一次只出现一次的字符
void findFirstSingle(char* str)
{
	int record[26] = {0};
	int len = strlen(str);
	for(int i = 0; i < len; ++i)
	{
		int index = *(str + i) - 'a';
		record[index]++;
	}
	char tmp;
	for(int i = 0; i < len; ++i)
	{
		int index = *(str + i) - 'a';
		if(record[index] == 1)
		{
			tmp = *(str + i);
			break;
		}
	}
	printf("%c\n",tmp);
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值