创新工场两道笔试题0919

原创 2012年09月20日 22:13:23

【题目1】

字符串去重,老题目,只是要求不能开辟新空间用来复制原字符串
思路:使用布尔型的简单hash表可以节省空间,用来存储字符是否出现的信息,刚开始hash表里面都是false,当第一次字符出现的时候,置成true,再次碰见的时候直接删除这个字符就行了。
char* remove_multiple_char(char* str)
{
	assert(str != NULL);
	char* tmp = str;
	char* tmp2 = str;
	bool hash_table[256] = {false};
	while(*tmp2 != '\0')
	{
		if (!hash_table[*tmp2 - '\0'])
		{
			hash_table[*tmp2 - '\0'] = true;
			*tmp++ = *tmp2++;
		}			
		else
		{
			tmp2++;
		}
	}
	*tmp = '\0';
	return str;
}

【题目2】

求逆序对个数,在一个数组a里,如果i < j,a[i]>a[j],那么<a[i],a[j]>称为一个逆序对,如3,5,1,2 一共有<3,1><3,2><5,1><5,2>四个逆序对
思路1:对数组中的每个数字,扫描它后面的数字,如果后面的数比这个数小,则存在逆序对,这样将数组扫描完需要的时间复杂度是O(N^2)
思路2:利用归并排序,归并排序的核心算法中,合并两个前后两个序列的时候,可以统计这两个前后序列之间的逆序对,再加上每个序列的逆序对,就是一共的逆序对,
//每个序列的逆序对,可以用递归分治
int g_inverse_count = 0;
void merge_core(int a[], int begin, int mid, int end)
{
	int i = begin;
	int j = mid+1;
	int *b = new int[end - begin + 1];
	int k = 0;
	while(i <= mid && j <= end)
	{
		if(a[i] < a[j])
			b[k++] = a[i++];
		else
		{
			b[k++] = a[j++];
			g_inverse_count += (mid - i + 1);
			//举个例子,原序列是9 10 2 4 3
			//最后要合并的两个左右序列是2 9 10 和4 3
			//刚开始a[i]=2 a[j] = 4,a[i]<a[j]不存在逆序对,将i++,a[i]->9
			//这时候a[i]>a[j],存在逆序对,并且前一个序列中a[i+1...mid]因为是已经排序的,
			//后面的每个数肯定也大于a[i],当然也大于a[j],当然也和a[j]成逆序对,这时候的逆序对的个数应该为mid-i+1
		}			
	}
	while(i <= mid)
	{
		b[k++] = a[i++];
	}		
	while(j <= end)
		b[k++] = a[j++];
	for (i = 0; i < k; i++)
		a[begin + i] = b[i];//替换原来的
	delete []b;
}

void merge_sort(int a[], int first, int last)
{
	if (first < last)
	{
		int mid = (last + first)/2;
		merge_sort(a, first, mid);
		merge_sort(a, mid+1, last);
		merge_core(a, first, mid, last);
	}
}

【测试】

int main()
{
	int data[] = {7, 1, 9, 10, 2, 3, 4};
	merge_sort(data, 0, 6);
	cout<<g_inverse_count;
	g_inverse_count = 0;
	int data2[] = {9, 10, 2, 4, 3};
	merge_sort(data2, 0, 4);
	cout<<g_inverse_count;
	
}



创新工场:实习感想

本文源自2012年7月 基本信息:我的好友,热情淳朴,努力谦虚。 1)对学历的要求?研究生和本科生什么比例? 对学历要求不高,本科生多些,比例大概是1:1.5. 2)对“是本地人”的要求高吗?...
  • jiangyoushijie
  • jiangyoushijie
  • 2014年11月21日 16:43
  • 520

创新工场笔试题

/* 给定一组整数1~n^2;按规则填入到n*n的二维数组中 例如:n = 4 1 3 4 10 2 5 9 11 6 8 12 15 7 13 14 16 */ void fu...
  • changjiangwuwu
  • changjiangwuwu
  • 2013年09月16日 22:18
  • 395

两道笔试题

1、设一颗完全二叉树共有699个节点,则这颗树种叶子节点共有多少个? 首先记n为二叉树节点总数,n0 , n1 , n2位二叉树中度为0 , 1 , 2的节点数。 则有:n = n0 + n1 + n...
  • u011907342
  • u011907342
  • 2015年08月25日 11:59
  • 343

获真格、创新工场、火星人、节点等十余家知名资本青睐——YeeCall要成为能赚钱的区块链社交平台

点击上方“蓝色字”可关注我们!记者:铅笔盒近日,真格基金布局的第一个区块链项目——海外通讯社交应用YeeCall浮出水面,进入公众视野。据了解,该项目不仅有真格基金,创新工场,元璟资本,如川投资,隆领...
  • IJXR1A64JI53L
  • IJXR1A64JI53L
  • 2018年01月12日 00:00
  • 198

创新工场一道笔试题

#include union A{ int i; char c[2]; }; int main(){ union A t; t.c[0] = 10; t.c[1] = 1; printf("%d...
  • yzx41099296
  • yzx41099296
  • 2012年09月07日 14:26
  • 351

创新工场2018笔试题

1给出N年的一个周期,计算2017年1月1日至2017+N-1年12月31日中17号周一到周日的次数,N为正整数且不大于400. 注意: 1、2017年1月17日是星期二. 2、闰年2月有29天...
  • zhanglu_1024
  • zhanglu_1024
  • 2017年08月26日 21:11
  • 90

2012-9-25 创新工场笔试题

1. 字节对齐问题: sizeof(Student)=24(求解释,为什么不是20) struct Student { int a; int b; double c; int d; } ; ...
  • shenshuiyoulan
  • shenshuiyoulan
  • 2012年09月25日 21:58
  • 1570

创新工场的一道笔试题

整个卷子出错的问题是堆排序,堆调整有一个参数写错了。几周不看,就出错了,看来考前一定要温习。 不会的题是写手动开平方。 static double sqrt(int a, int k) { ...
  • yellowxz
  • yellowxz
  • 2013年09月16日 23:09
  • 648

2011 创新工场 暑期实习 笔试题

    很荣幸收到创新工场的笔试通知,巧的是这将是我第一次笔试经历, 进去以后,发现气氛有点紧张,因为大家互相不认识,但是都默不作声,所以有点小尴尬,这样气氛让本来就有点饿的我更觉得有点不自在。。。难...
  • stona126
  • stona126
  • 2011年05月20日 13:58
  • 895

2014创新工场笔试题

选择题 1. 若进栈序列为a、b、c、d,进栈过程中可以出栈,那么()不可能是一个出栈序列。    A.cbad     B.bdca     C.adbc    D.cdba 2. 完全二叉树中...
  • u011729265
  • u011729265
  • 2013年09月30日 21:53
  • 1072
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:创新工场两道笔试题0919
举报原因:
原因补充:

(最多只允许输入30个字)