腾讯2017暑期实习生笔试题题解

2023-11-15

7个月没有刷题了,现在真的是菜到爆炸,所以来牛客水一水编程题。

一、构造回文

题意:

给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢?
输出需要删除的字符个数。

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出一个整数,代表最少需要删除的字符个数。

输入例子1:
abcda
google

输出例子1:
2
2

题解:

题目要求的是,最少删除多少个字符可以让剩下的串是回文串,其实就是要求字符串中的最长回文子串是多少。
我们可以考虑一下回文串的特点,那就是前半部分必须和后半部分的颠倒是相同的。那我们不妨创建一个新字符串,把原串给颠倒回来,这样我们就变成了正序匹配了。
意思就是再定义一个字符串tmp为原串的翻转,然后求一下原串和tmp的最长公共子序列即可。

代码:

#include<stdio.h>
#include<string.h>
int dp[1005][1005];
int max(int a,int b){
	return a>b?a:b;
}
int main()
{
	char s[1005],tmp[1005];
	int len;
	while(scanf("%s",s)!=EOF)
	{
		len=strlen(s);
		for(int i=0;i<len;i++)tmp[i]=s[len-i-1];
		for(int i=1;i<=len;i++)
        {
            for(int j=1;j<=len;j++)
            {
                if(s[i-1]==tmp[j-1])
                {
                    dp[i][j]=dp[i-1][j-1]+1;
                }
                else
                {
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        printf("%d\n",len-dp[len][len]);
	}
}

二、字符移位

题意:

小Q最近遇到了一个难题:把一个字符串的大写字母放到字符串的后面,各个字符的相对位置不变,且不能申请额外的空间。
你能帮帮小Q吗?

输入描述:

输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000.

输出描述:

对于每组数据,输出移位后的字符串。

输入例子1:
AkleBiCeilD

输出例子1:
kleieilABCD

题解:

这题唯一的技巧就是逆向遍历(避免大写字母内部顺序被打乱),剩下的都是模拟了。我们以末尾为起点向左进发,遇到大写字母就给它往右搬就可以了。

代码:

#include<stdio.h>
#include<string.h>
int islower(char a)
{
	if(a>='a'&&a<='z')return 1;
	else return 0;
}
int isupper(char a)
{
	if(a>='A'&&a<='Z')return 1;
	else return 0;
}
int main()
{
    char s[1005];
    while (scanf("%s",s)!=EOF)
    {
        int n,j;
        int len=strlen(s);
        for(int i=len-1;i>0;i--)
        {
            if(islower(s[i]))
            {
                j=i;
                while(islower(s[j])&&j>=1)
                {
                    j--;
                }
                if(j==0&&islower(s[j]))
                {
                    break;
                }
                if(isupper(s[j]))
                {
                    char temp=s[j];
                    for(int k=j;k<i;k++)s[k]=s[k+1];
                    s[i]=temp;
                }
            }
        }
        printf("%s\n",s);
    }
    return 0;
}

三、有趣的数字

题意:

小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,相差最小的有多少对呢?相差最大呢?

输入描述:

输入包含多组测试数据。

对于每组测试数据:

N - 本组测试数据有n个数

a1,a2…an - 需要计算的数据

保证:

1<=N<=100000,0<=ai<=INT_MAX.

输出描述:

对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数。

输入例子1:
6
45 12 45 32 5 6

输出例子1:
1 2

题解:

首先看一下数据量,n是十万量级,O(n^2)的算法全部gg,所以乱序肯定是不可取的,开局应该先快排一下,变成有序的序列。

先考虑差最大,很显然的是最后一个元素和第一个元素的差一定是最大的。所以假如有a个元素和第一个元素相等,有b个元素和最后一个元素相等,那么结果就是a×b了。
但是事实上少考虑了一种情况,那就是第一个元素和最后一个元素相等的时候,这种情况下a=n,b=n,a×b=n^2显然是不对的(因为a和b计数有重叠部分),所以需要特判:当第一个元素=最后一个元素时,答案应该是在n个中任意取2个的种数:Cn2=n×(n-1)/2

再考虑差最小,同样也需要分两种情况:序列中无重复数字、序列中有重复数字。
假如序列中无重复数字,那只需要跑一遍序列,分别计算相邻两数的差,同时计一下数就好了;
假如序列中有重复数字,那我们就可以检查各个数字的重复个数,最后使用Σ(ki*(ki-1)/2)即可。(ki是指i这个数的数量)

代码:

#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
    return *(int *)a - *(int *)b;
}
int main()
{
	int a[100005],n,ansx=0,ansy=0;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++)scanf("%d",&a[i]);
		qsort(a,n,sizeof(a[0]),cmp);
		int tmpa=0,tmpb=0,tmpc=a[n-1]-a[0],k=0;
		while(a[k]==a[0])
		{
			tmpa++;
			k++;
		}
		k=n-1;
		while(a[k]==a[n-1])
		{
			tmpb++;
			k--;
		}
		if(a[n-1]!=a[0])ansx=tmpa*tmpb;
		else ansx=n*(n-1)/2;
		
		for(int i=1;i<n;i++)
		{
			if(a[i]-a[i-1]<tmpc)
			{
				ansy=1;
				tmpc=a[i]-a[i-1];
			}
			else if(a[i]-a[i-1]==tmpc)ansy++;
		}
		if(tmpc==0)
		{
			ansy=0;k=0;int b=0;
			while(k<n)
			{
				while(b<n&&a[k]==a[b])b++;
				ansy+=(b-k)*(b-k-1)/2;
				k=b;
			}
		}
		printf("%d %d\n",ansy,ansx);
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

腾讯2017暑期实习生笔试题题解 的相关文章

  • uni-app实现点击按钮复制内容

    uni setClipboardData obj API方法
  • 手撸算法-两数之和-牛客

    描述 给出一个整数数组 请在数组中找出两个加起来等于目标值的数 你给出的函数twoSum 需要返回这两个数字的下标 index1 index2 需要满足 index1 小于index2 注意 下标是从1开始的 假设给出的数组中只存在唯一解
  • 记一次映射公网地址FTP服务问题的解决方法

    因为需要FTP公网进行访问 遂在公司搭建FTP服务使用软件 免费开源的Fillzilla Server版本 当然这不是主要的添加用户密码 用户访问目录 更改21端口为21212出现棘手问题 因为公司使用cisco路由器公网接入 默认所有公网
  • JavaWeb 文件上传和下载

    目录 一 文件上传 1 文件上传和下载的使用说明 2 文件上传基本原理 3 文件上传经典案例 3 1 页面实现 3 2 servlet实现 3 3 工具类实现 3 4 运行测试 3 5 注意事项 二 文件下载 1 文件下载基本原理 2 文件

随机推荐

  • 2023年自学网络安全学习路线,收藏这一篇就够了(超详细)

    00 网络安全为啥突然 火 了 随着网络空间成为第五空间 社会基础产业全面互联网化 网络安全 或称广义的信息安全 面临的威胁越来越大 对网络安全的人才需求也呈现出井喷趋势 即使目前很多人可以自学成才 网络空间安全 也成为一级学科 但根据 第
  • js动态加载js和css

    一 动态加载CSS动态创建css样式有两种方式 1 动态插入css外部文件的方法 function loadStyle url var link document createElement link link type text css
  • Android Instrumentation模拟鼠标点击事件

    看了几遍网上的博客一直没有 模拟出鼠标点击事件和按钮事件 后来抱着试试态度再重试的时候终于有所斩获 下面把具体的情况记录一下 首先我们必须了解类 Instrumentation Instrumentation发送键盘鼠标事件 Instrum
  • 什么是DNS服务器?有哪些作用?

    什么是DNS服务器 DNS服务器是 Domain Name System或者Domain Name Service 域名系统或者域名服务 域名系统为Internet上的主机分配域名地址和IP地址 用户使用域名地址 该系统就会自动把域名地址转
  • 智能一体化运维平台(一)java实现ssh连接

    一 思路 1 作为java的web后台应用 在做ssh连接的时候 比如导入所需要的协议jar包 如ssh jar 本次测试 本人使用的是 2 导入jar包后 开始进入代码编程 首先需要进行创建用户名 密码 端口 ip地址等变量 用来存储对应
  • 腾讯云技术分享:MySQL AHI 实现解析

    MySQL 定位用户记录的过程可以描述为 打开索引 gt 根据索引键值逐层查找 B 树 branch 结点 gt 定位到叶子结点 将 cursor 定位到满足条件的 rec 上 如果树高为 N 则需要读取索引树上的 N 个结点并进行比较 如
  • linux 线程和进程的区别与联系::

    进程 承担分配系统资源的基本实体 线程 调度的基本单位 线程是进程里面的执行流 线程在进程的地址空间内运行 linux中没有真正意义上的线程 线程是用进程模拟的 地址空间上 线程没有自己独立的地址空间 共享进程的空间 但是进程包含独立的地址
  • 微信小程序-“授权失败”场景的优雅处理

    微信小程序中提供了相关API 让开发者能获取到微信用户的相关信息 在首次去获取的时候会展示一个用户是否同意授权的对话框 发现有不少线上的小程序都没有处理好用户 拒绝授权 导致的 授权失败 场景 一个观点 私认为 开发微信小程序在用户授权上有
  • 蘑菇街前端面试

    vue与jquery的区别 为什么现在很多人使用vue vue怎样实现双向数据绑定 内部原理 1 jQuery首先要获取到dom对象 然后对dom对象进行进行值的修改等操作 2 Vue是首先把值和js对象进行绑定 然后修改js对象的值 Vu
  • iview Table中switch值无法刷新问题

    table里面的开关在修改状态以后 翻页后状态不在变化 render h params gt return h i switch props size large value params row filterContact on可以传入绑
  • Tkinter 组件详解(七):Entry

    Tkinter 组件详解之Entry Entry 输入框 组件通常用于获取用户的输入文本 何时使用 Entry 组件 Entry 组件仅允许用于输入一行文本 如果用于输入的字符串长度比该组件可显示空间更长 那内容将被滚动 这意味着该字符串将
  • leetcode刷题——多维枚举(一)

    题目一 思路 双指针 bool isSubsequence char s char t int fast 0 int slow 0 while slow
  • JavaWeb之Servlet详解

    文章目录 一 什么是Servlet 二 Servlet 1 Servlet是如何起作用的 2 Servlet接口中的方法 3 Servlet对象的生命周期 三 ServletConfig 1 什么是ServletConfig 2 Servl
  • MOS驱动自举电容和限流电阻的选取

    自举电容选取 最近做逆变时出现了异常 使用2104驱动MOS管 蓝色为滤波后双端带载时出现的波形 一端带载时没有问题 放大波形后发现输出波形在占空比满值时垮掉 产生严重的震荡 可以看到波形顶部斜向下 我们可以推断是驱动自举电容值偏小 当占空
  • ARMv8-A 地址翻译技术之MMU的前世今生

    MMU的重要性不言而喻 支撑操作系统之上的各种复杂应用 但在正式讲MMU之前 我们先说说MMU的发展史 因为ARMv8 A的MMU相当复杂 直接切入正题 会显得比较枯燥 废话不多说 咱们马上开始 一 前言 关于虚拟内存系统的演变史 MMU在
  • 计划 060703

    ESOE项目暂时作为一个自娱型项目 每日投入30分钟 近期按计划完成以下工作 1 完成计划 ok 2 完成对ESOE项目的介绍 ok 060704 3 在blog发布已有的 ESOE Specification v0 1 doc 英文版 o
  • 什么是.NET架构

    什么是 NET架构 NET架构主要分为3部分 FCL Framework Class Library CTS Common Type System 其中包括Common Language Specification CLR Common L
  • 教你自制一款简单的助听器

    助听器实质上是一种低频放大器 可用耳机进行放音 当使用者用上耳机后 可提高老年者的听觉 同时可对青少年的学习和记忆能带来方便 一 工作原理 本电路由话筒 前置低放 功率放大电路和耳机等部分组成 原理电路图见图1 其印刷板电路图见图2 驻极体
  • c++面对对象基础知识

    一 类的定义格式 class calss name private data member declarations public member functions 二 构造函数 1 在程序声明对象时 将自动调用构造函数 2 c 提供两种构
  • 腾讯2017暑期实习生笔试题题解

    7个月没有刷题了 现在真的是菜到爆炸 所以来牛客水一水编程题 一 构造回文 题意 给定一个字符串s 你可以从中删除一些字符 使得剩下的串是一个回文串 如何删除才能使得回文串最长呢 输出需要删除的字符个数 输入描述 输入数据有多组 每组包含一