首页 > 8.9字节跳动笔试(1,3)
头像
俺是好骚年
编辑于 2020-08-13 03:08
+ 关注

8.9字节跳动笔试(1,3)

  1. 完美字符串

长度为n的字符串,均为小写字母,修改m个位置的字母,修改完毕后选取这个字符串的连续子串,

满足这个子串只有一种字母,这个子串就是完美子串 求最长完美子串长度

#include<stdio.h>
#include<string.h>
#define maxsize 100000
int max(int a, int b);
int main(void)
{
	char str1[maxsize];
	int m;
	scanf("%d",&m);
	scanf("%s", str1);
	int len = strlen(str1);
	int result = 0;
	for (char ch1 = 'a';ch1<= 'z'; ch1++)
	{
		int left = 0, right = 0;
		int k = m;
		while (right < len)
		{
			if (str1[right] == ch1)
				right++;
			else
			{
				if (k > 0)
				{
					k--;
					right++;
				}
				else  //k==0 [left,right)
				{
					result = max(result, right - left);
					while (str1[left] == ch1)
						left++;
					left++;
					right++;
				}

			}
		
		}
		result = max(result, right - left);
	}
	printf("%d",result);
	return 0;
}
int max(int a, int b)
{
	return a > b ? a : b;
}

3.多骨诺米牌

要求 排在后面的牌的高和宽都要大于前面的牌,问最多能选几张牌

#include<stdio.h>
int cmp(const void* a, const void* b);
int main(void)
{
	int n;
	scanf("%d",&n);
	int** nums = malloc(sizeof(int*) * n);
	/*读入牌的信息*/
	for (int i = 0; i < n; i++)
	{
		nums[i] = malloc(sizeof(int) * 2);
		scanf("%d %d",&nums[i][0],&nums[i][1]);
	}
	/*快排 将该问题转换为最长上升子串问题*/
	qsort(nums, n, sizeof(int*), cmp);
	int* q = malloc(sizeof(int) * n);//q[i] 长度为i+1的上升子串的末尾值的最小值
	int count = 0;
	q[count] = nums[0][1];
	for (int i = 1; i < n; i++)
	{
		if (nums[i][1] > q[count])
		{
			q[++count] = nums[i][1];
		}

		else// 找到q中第一个大于等于nums[i][1]的值 并 替换它  (二分法)
		{
			int left = 0, right = count;
			while (left < right)
			{
				int mid = left + (right - left) / 2;
				if (q[mid] < nums[i][1])//[mid+1,right]
					left = mid + 1;
				else //q[mid]>=nums[i][1] [left,mid]
					right = mid;
			}
			q[left] = nums[i][1];
		}
		
	}
	printf("%d",count+1);
	return 0;
}
int cmp(const void* a, const void* b)
{
	if ((*(int**)a)[0] == (*(int**)b)[0])
		return (*(int**)b)[1]-(*(int**)a)[1];
	return(*(int**)a)[0] - (*(int**)b)[0];
}


全部评论

(1) 回帖
加载中...
话题 回帖

相关热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐