2015美团笔试

用O(n)的算法,实现对一组无序的字母进行从小到大排序(区分大小写),相同的字母,小写在大写前

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


int rightorder(char *src, char *des)
{
	int m = strlen(src);
	int tmp[100]={0};
	int index=0;
	int i,j=0;
	
	for(i=0; i<m; i++)
	{
		if(src[i] <= 'z' && src[i] >= 'a')
		{
			tmp[(src[i]-'a')*2] ++;
		}
		if(src[i] <= 'Z' && src[i] >= 'A')
		{
			tmp[(src[i]-'A')*2 + 1]++;
		}
	}
	
	for(i=0;i<100;i++)
	{
		if(tmp[i] != 0)
		{
			if(i%2 == 0)    //小写
			{
				for(j=0;j<tmp[i];j++)
				{
					des[index++] = (char)(i/2 +'a');
				}
			}
			else                     //大写
			{
				for(j=0;j<tmp[i];j++)
					des[index++] = (char)((i-1)/2+'A');
			}
		}
	}
	
	return 0;
}

int main(int argc, char *argv[])
{
	char src[54] =  "0";
	char des[54] = "0";
	char a;
	printf("输入字符串:\n");
	scanf("%s",src);
	
	rightorder(src, des);
	
	printf("%s\n",des);
	return 0;
}

给定N个磁盘,每个磁盘大小为D[i],i=0...N-1,现在要在这N个磁盘上"顺序分配"M个分区,每个分区大小为P[j], j=0....M-1,顺序分配的意思是:分配一个分区P[j]时,如果当前磁盘剩余空间足够,则在当前磁盘分配;如果不够,则尝试下一个磁盘,直到找到一个磁盘D[i+k]可以容纳该分区,分配下一个分区P[j+1]时,则从当前磁盘D[i+k]的剩余空间开始分配,不在使用D[i+k]之前磁盘末分配的空间,如果这M个分区不能在这N个磁盘完全分配,则认为分配失败,请实现函数,is_allocable判断给定N个磁盘(数组D)和M个分区(数组P),是否会出现分配失败的情况。举例:磁盘为[120,120,120],分区为[60,60,80,20,80]可分配 ,如果为[60,80,80,20,80]则分配失败

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

int main(int argc, char *argv[])
{
	int A[3] = {120,120,120};
	int B[5] = {60,60,80,20,80};
	//int B[5] = {60,80,80,20,80};
	
	int M = sizeof(B)/sizeof(int);
	//printf("%d\n",M);
	int N = sizeof(A)/sizeof(int);
	//printf("%d\n",N);
	int i,j=0;
	
	int flag =0;
	
	for(i=0; i< N; i++)
	{	
		while(A[i]>0)
		{
			if(A[i] >= B[j])
			{
				A[i] = A[i] -B[j];
				printf("%d\n",A[i]);
				j++;
				//printf("%d\n",j);
				
				if(j == M)
				{
					//printf("分配成功\n");
					flag = 1;;		
				}
					
			}
			else
				break;
		}		
	}	
	
	if (flag == 1)
	{
		printf("分配成功\n");
	}
	else 
		printf("分配失败\n");
	
	return 0;
}

给定正整数X,定义函数A(n)=1+x+x^2+x^3+...+x^n(n为整数且>=0),已知乘运算的时间远大于加运算,
输入x,n:如何尽可能快的求出A(n)。这题应该有更好的解决方法吧。。
int func(int x, int n)
{
	int tmp = 1 + x;
	for(i=0;i<n;i++)
	{	
		tmp = tmp *x +1;
	}
	return tmp;
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值