2014校园招聘 华为机试题

本文探讨了有趣的算法问题,包括通过n次开关操作后亮着的电灯数量、大数相加的实现方法及字符串压缩算法。此外,还讨论了如何找出一串数字中的最大递增子序列。
1,亮着电灯的盏数  
一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。 

有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。 注:电灯数和学生数一致。


void light(int n)
{
	int cnt = 0;
//	int a[n]={0};
	int *a = new int[n+1];
	memset(a,0,(sizeof(int)*(n+1)));
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(j%i == 0)
			{
				if(!a[j])
					a[j] = 1;
				else
					a[j] = 0;
			}
		}
		
	}
	for(int k=1;k<=n;k++)
	{
		if(a[k])
		{
//			printf("%d ",k);
			cnt++;
		}
	}
	cout<<endl;
	printf("%d\n",cnt);
	delete [] a;
}

2,正整数的大数相加

void bigPlus(char* a, char *b)
{
	int i = strlen(a)-1;
	int j = strlen(b)-1;
	int len = i>j?i:j;
	char *res = new char[len+2];
	memset(res,0,(sizeof(char)*(len+2)));
	int cnt = 0;
	int k = 0;//k是进位标志
	while(i>=0&&j>=0)
	{
		res[cnt++] = (((a[i]-'0')+(b[j]-'0')+k)%10)+'0';
		k = ((a[i]-'0')+(b[j]-'0')+k)/10;
		i--;j--;
	}
	while(i>=0)
	{
		res[cnt++] = (((a[i]-'0')+k)%10)+'0';
		k = ((a[i]-'0')+k)/10;
		i--;
	}
	while(j>=0)
	{
		res[cnt++] = (((b[j]-'0')+k)%10)+'0';
		k = ((b[j]-'0')+k)/10;
		j--;
	}
	if(k!=0)
		res[cnt++] = '1';

	for(int t = cnt-1;t>=0;t--)
	{
		printf("%c",res[t]);
	}
	cout<<endl;
	delete [] res;

}

3,

题目描述(40分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。

要求实现函数: 
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);

【输入】 pInputStr:  输入字符串
            lInputLen:  输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;

【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出

示例 
输入:“cccddecc”   输出:“3c2de2c”
输入:“adef”     输出:“adef”
输入:“pppppppp” 输出:“8p”

void myZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
	char buffer[20];
	int num = 0,k=0;
	for(int i =0;i<strlen(pInputStr);i++)
	{
		for(int j=i+1;j<strlen(pInputStr);j++)
		{
			if(pInputStr[i] == pInputStr[j])
			{
				num++;
			}
			else
				break;

		}
		if(0 != num)
		{
			memset(buffer,0,sizeof(buffer));
			itoa(num+1,buffer,10);
			strcpy(pOutputStr+k,buffer);
			k += strlen(buffer);
		}
		pOutputStr[k++] = pInputStr[i];
		i +=num;
		num = 0;
	}
	pOutputStr[k ]='\0';

	printf("%s\n",pOutputStr);
}
int main(int argc, char* argv[])
{
	char a[max]={0};
	char b[max]={0};
	
	while(scanf("%s %s",a,b)!= EOF)
	{
	//	myZip(a,20,b);
		bigPlus(a,b);
	}
	
//	int num;
//	cin>>num;

 //   light(num);
	char tmp;
	tmp = getchar();
	return 0;
}


4,题目:

描述: 
输入一串数字,找到其中包含的最大递增数。递增数是指相邻的数位从小到大排列的数字。如: 2895345323,递增数有:289,345,23, 那么最大的递减数为345。 
输入: 
输入一串数字,默认这串数字是正确的,即里面不含有字符/空格等情况 
输出: 
输出最大递增数 
样例输入: 
123526897215 
样例输出: 
2689

void getMaxSub(char* a,int len)
{
	char* tmp = new char[len];
	memset(tmp,0,sizeof(char)*len);

		char* ans = new char[len];
	memset(ans,0,sizeof(char)*len);

	int cnt = 0,last =0;
	for(int i =0;i<len;i++)
	{
		if((i+1)<len&&a[i+1]>a[i])
			tmp[cnt++] = a[i];
		else{
			tmp[cnt++] = a[i];
			if(cnt>last)
			{
				strcpy(ans,tmp);
				last = cnt;
			}
			if(cnt == last)
				if(strcmp(tmp,ans)>=0)
					strcpy(ans,tmp);
				last = cnt;
			}
			cnt = 0;
			memset(tmp,0,sizeof(char)*len);
		}

	}

	for(int j = 0;j<len;j++)
	{

		if(ans[j]!=0)
			printf("%c",ans[j]);
	}
		
	cout<<endl;

	delete [] tmp;
	delete [] ans;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值