【备战秋招】每日一题:3月18日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

news2024/11/23 18:47:10

2023大厂笔试模拟练习网站(含题解)

www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。
在这里插入图片描述
提交链接:

https://codefun2000.com/p/P1089

为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"

题目内容

塔子哥是一个热衷于算法竞赛的程序员,他最近在参加一场名为“回文字符串”的比赛。比赛规则是给定一个字符串,要求将其修改为一个回文字符串,所修改的字符位置最多只能有两个,并且要求修改后的字符串字典序最小。

塔子哥在比赛中遇到了困难,不知道如何处理才能让修改后的字符串达到要求。于是他找到了你,希望你能帮助他解决问题,数据保证能在题目限制下形成回文字符串。

注:回文字符串:即一个字符串从前向后和从后向前是完全一致的字符串。例如字符串 a b c b a , a a a a , a c c a abcba,aaaa,acca abcba,aaaa,acca都是回文字符串。字符串 a b c d , a c e a abcd,acea abcd,acea都不是回文字符串。

输入描述

一行,一个字符串。字符串中仅由小写英文字符构成。

保证字符串不会是空字符串。

字符串长度介于 [ 1 , 100000 ] [1,100000] [1,100000] 之间。

输出描述

一行,一个在题目条件限制下所可以获得的字典序最小的回文字符串。

样例 1 1 1

输入

acca

输出

aaaa

说明:
原来的字符串已经是回文字符串了。但它不是题目条件下可以取得的字典序最小的回文字符串。将第二个字符和第三个字符都改为 a a a可以获得字典序最小的回文字符串。

样例 2 2 2

输入

abcde

输出

abcba

说明
d e de de改为 b a ba ba可以获得字典序最小的回文字符串。

题目思路

step1:贪心

由于字符串经过修改一定为回文串,且最多修改两次,所以原字符串位置 i i i与对称位置 n − i − 1 n-i-1 ni1不一样的个数最多为2。所以统计一下需要改的位置个数,记为 c n t cnt cnt.

1.当原字符串为回文串时( c n t = 0 cnt = 0 cnt=0),那么找到第一个不为’a’的位置和其对称位置,将他们都改成’a’

2.当不同位置个数为1( c n t = 1 cnt = 1 cnt=1)时,又分为两种情况:

​ 1.可能一个为’a’而一个为非’a’的情况,那么如果此时字符串长度为奇数,那么还可以修改中间位置为’a’!

​ 2.若两个位置都不为’a’,那么就将其全部改为’a’。

3.如果有不同位置的个数为2时( c n t = 2 cnt = 2 cnt=2),则修改两个位置为两个位置的asc码最小值。

类似题目推荐

塔子哥来推荐几道 字符串 + 贪心 相关的题目给大家训练!

leetcode

  1. 680. 验证回文字符串 Ⅱ
  2. 1754. 构造字典序最大的合并字符串

CodeFun2000

P1077 美团春招-2023.3.11-第一题-字符串修改

P1101. 阿里-2023.03.21-第二题-最大化01串中1的个数

P1108. 腾讯音乐-2023.3.23-第四题-调整字符串

代码

C++

#include<bits/stdc++.h>
using namespace std;

void solve() {
    string s;
    cin >> s;
    int n = s.size();
    int cnt = 0;
    // 遍历字符串,统计需要改变位置的个数
    for (int i = 0; i <= n / 2; i++) {
        if (s[i] != s[n - i - 1]) cnt++;
    }
    if (cnt == 0) { // 原字符串已经是回文串
        for (int i = 0; i < n; i++) {
            if (s[i] != 'a') { // 找到第一个不为'a'的位置和其对称位置并改为'a'
                s[i] = 'a', s[n - i - 1] = 'a';
                break;
            }
        }
    }
    else if (cnt == 1) { // 不同位置的个数为1
        for (int i = 0; i < n; i++) {
            if (s[i] != s[n - i - 1]) {
                if (s[i] == 'a' || s[n - i - 1] == 'a') { // 一个位置为'a',另一个位置不为'a'
                    if (n % 2) s[n / 2] = 'a'; // 若字符串长度为奇数,修改中间位置为'a'
                }
                s[i] = 'a', s[n - i - 1] = 'a';
            }
        }
    } else { // 不同位置个数为2
        for (int i = 0; i < n; i++) {  // 修改这两个位置为ascii码值较小的字符
            if (s[i] != s[n - i - 1]) s[i] = min(s[i], s[n - i - 1]), s[n - i - 1]   = s[i];
        }
    }
    // 输出修改后的字符串
    cout << s << endl;
}

int main() {
    int t = 1;
    // cin >> t;
    while (t--) solve(); // 处理多组测试数据
    return 0;
}

python

s = list(input())  # 将输入的字符串转化为列表
n = len(s)  # 获取字符串长度
cnt = 0
# 遍历字符串,统计需要改变位置的个数
for i in range(n // 2):
    if s[i] != s[n - i - 1]:
        cnt += 1
if cnt == 0:  # 原字符串已经是回文串
    for i in range(n):
        if s[i] != 'a':  # 找到第一个不为'a'的位置和其对称位置并改为'a'
            s[i] = 'a'
            s[n - i - 1] = 'a'
            break 
elif cnt == 1:  # 不同位置的个数为1
    for i in range(n):
        if s[i] != s[n - i - 1]:
            if s[i] == 'a' or s[n - i - 1] == 'a':  # 一个位置为'a',另一个位置不为'a'
                if n % 2 == 1:
                    s[n // 2] = 'a'  # 若字符串长度为奇数,修改中间位置为'a'
            s[i] = 'a'
            s[n - i - 1] = 'a'    
else:  # 不同位置个数为2
    for i in range(n):  # 修改这两个位置为ascii码值较小的字符
        if s[i] != s[n - i - 1]:
            s[i] = min(s[i] , s[n - i - 1])
            s[n - i - 1] = s[i]
print("".join(s))  # 将列表转化为字符串并输出

Java

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        char[] s = str.toCharArray();  // 将字符串转化为字符数组
        int n = s.length, cnt = 0;
        for (int i = 0; i < n / 2; i++) {  // 遍历一半的字符
            if (s[i] != s[n - i - 1]) {  // 如果对称位置字符不同,则需要改变该字符使其对称
                cnt++;
            }
        }
        if (cnt == 0) {  // 已经是回文串
            for (int i = 0; i < n; i++) {  // 从两端开始寻找第一个字符不是a的位置
                if (s[i] != 'a') {
                    s[i] = 'a';
                    s[n - i - 1] = 'a';  // 改为a
                    break;
                }
            }
        } 
        else if (cnt == 1) {  // 不同的位置只有一个
            for (int i = 0; i < n; i++) {
                if (s[i] != s[n - i - 1]) {
                    if (s[i] == 'a' || s[n - i - 1] == 'a') {  // 一个为'a',另一个不为'a'
                        if (n % 2 == 1) {  // 字符串长度为奇数,中间位置改为'a'
                            s[n / 2] = 'a';
                        }
                    }
                    s[i] = 'a';
                    s[n - i - 1] = 'a';
                }
            }
        } 
        else {  // 不同的位置有两个
            for (int i = 0; i < n; i++) {  // 修改这两个位置为ascii码值较小的字符
                if (s[i] != s[n - i - 1]) {
                    s[i] = (char) Math.min(s[i], s[n - i - 1]);
                    s[n - i - 1] = s[i];
                }
            }
        }
        System.out.println(String.valueOf(s));  // 将字符数组转化为字符串输出
    }
}

Go

package main
import (
	"fmt"
)
func main() {
	var str string
	fmt.Scan(&str)
	s := []byte(str)  // 将字符串转化为字节数组
	n, cnt := len(s), 0
	for i := 0; i < n/2; i++ {  // 遍历一半的字符
		if s[i] != s[n-i-1] {  // 如果对称位置字符不同,则需要改变该字符使其对称
			cnt++
		}
	}
	if cnt == 0 {  // 已经是回文串
		for i := 0; i < n; i++ {  // 从两端开始寻找第一个字符不是'a'的位置
			if s[i] != 'a' {
				s[i] = 'a'
				s[n-i-1] = 'a'  // 改为'a'
				break
			}
		}
	} else if cnt == 1 {  // 不同的位置只有一个
		for i := 0; i < n; i++ {
			if s[i] != s[n-i-1] {
				if s[i] == 'a' || s[n-i-1] == 'a' {  // 一个为'a',另一个不为'a'
					if n%2 == 1 {  // 字符串长度为奇数,中间位置改为'a'
						s[n/2] = 'a'
					}
				}
				s[i] = 'a'
				s[n-i-1] = 'a'
			}
		}
	} else {  // 不同的位置有两个
		for i := 0; i < n; i++ {  // 修改这两个位置为ascii码值较小的字符
			if s[i] != s[n-i-1] {
				s[i] = byte(min(int(s[i]), int(s[n-i-1])))
				s[n-i-1] = s[i]
			}
		}
	}
	fmt.Println(string(s))  // 将字节数组转化为字符串输出
}
func min(x, y int) int {  // 返回两个整数中较小的那个
	if x < y {
		return x
	}
	return y
}

Js

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
    return;
});
process.stdin.on('end', () => {
    const lines = input.trim().split('\n');
    const str = lines[0];
    const s = [...str];  // 将字符串转化为字符数组
    const n = s.length;
    let cnt = 0;
    for (let i = 0; i < n/2; i++) {  // 遍历一半的字符
        if (s[i] !== s[n-i-1]) {  // 如果对称位置字符不同,则需要改变该字符使其对称
            cnt++;
        }
    }
    if (cnt === 0) {  // 已经是回文串
        for (let i = 0; i < n; i++) {  // 从两端开始寻找第一个字符不是'a'的位置
            if (s[i] !== 'a') {
                s[i] = 'a';
                s[n-i-1] = 'a';  // 改为'a'
                break;
            }
        }
    } else if (cnt === 1) {  // 不同的位置只有一个
        for (let i = 0; i < n; i++) {
            if (s[i] !== s[n-i-1]) {
                if (s[i] === 'a' || s[n-i-1] === 'a') {  // 一个为'a',另一个不为'a'
                    if (n%2 === 1) {  // 字符串长度为奇数,中间位置改为'a'
                        s[Math.floor(n/2)] = 'a';
                    }
                }
                s[i] = 'a';
                s[n-i-1] = 'a';
            }
        }
    } else {  // 不同的位置有两个
        for (let i = 0; i < n; i++) {  // 修改这两个位置为ascii码值较小的字符
            if (s[i] !== s[n-i-1]) {
                s[i] = String.fromCharCode(Math.min(s[i].charCodeAt(), s[n-i-1].charCodeAt()));
                s[n-i-1] = s[i];
            }
        }
    }
    console.log(s.join(''));  // 将字符数组转化为字符串输出
});

模板

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
    return;
});
process.stdin.on('end', () => {
    const lines = input.trim().split('\n');
    // write your code here
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555724.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

简易someip服务发现SD报文演示

环境 $ cat /etc/os-release PRETTY_NAME"Ubuntu 22.04.1 LTS" NAME"Ubuntu" VERSION_ID"22.04" VERSION"22.04.1 LTS (Jammy Jellyfish)" VERSION_CODENAMEjammy IDubuntu ID_LIKEdebian HOME_URL"https://www.ubuntu.com/"…

chatgpt赋能Python-pythonsum

Pythonsum&#xff1a;优秀的Python算法包介绍 Pythonsum是Python语言的一个优秀的算法包&#xff0c;具有很高的可重用性和性能&#xff0c;支持大规模数据处理和复杂算法实现。本文将为大家介绍Pythonsum的基本功能和优势。 Pythonsum的基本功能 Pythonsum提供了一系列丰富…

华为OD机试真题 Java 实现【对称字符串】【2023Q2 200分】

一、题目描述 对称就是最大的美学&#xff0c;现有一道关于对称字符串的美学。 已知&#xff1a; 第 1 个字符串&#xff1a;R 第 2 个字符串&#xff1a;BR 第 3 个字符串&#xff1a;RBBR 第 4 个字符串&#xff1a;BRRBRBBR 第 5 个字符串&#xff1a;RBBRBRRBBRRBRBBR …

扑克牌大小OJ题

题目链接 扑克牌大小_牛客题霸_牛客网 题目完整代码 #include <iostream> #include<string> #include<algorithm> using namespace std;// left_str 左边牌 // right_str 右边牌// left_count 左边牌数 // right_count 右边牌数// left_first 左边第一个牌…

chatgpt赋能Python-pythonsep怎么用

Python在SEO中的应用 Python一直是广受欢迎的编程语言之一&#xff0c;它拥有强大的功能和易于使用的特性&#xff0c;使得它成为了许多开发人员们的首选。“Pythonsep”是Python在SEO中的应用&#xff0c;它可以帮助用户更好地优化自己的网站&#xff0c;让网站更容易被用户发…

搭建python web环境----Django

第一步&#xff1a;安装Django 1.进入cmd&#xff1a;pip install django -i https://pypi.tuna.tsinghua.edu.cn/simple 2.检测版本&#xff1a; 第二步&#xff1a;配置环境变量 1.查找python安装位置: 2.打开django文件夹中bin文件夹&#xff1a; 查看django的安装位置&am…

火爆CV圈的SAM是什么?

SAM是什么 前言 最近几周&#xff0c;人工智能的圈子里都在讨论SAM&#xff08;Segment Anything Model&#xff09;&#xff0c;一个号称&#xff08;零样本&#xff09;分割一切的图像分割模型。 图&#xff1a;Segment Anything Demo 2023年4月6号&#xff0c;Meta AI发布…

npm install(报错)

1、npm install 报错&#xff08;如图&#xff09; WARN ERESOLVE overriding peer dependency npm WARN While resolving: intervolga/optimize-cssnano-plugin1.0.6 npm WARN Found: webpack3.12.0 npm WARN node_modules/webpack npm WARN peer webpack"^2.0.0 || ^3…

spring源码学习

1.xmlBeanFactory对defaultListableBeanFactory类进行扩展&#xff0c;主要用于从XML文档中获取BeanDefinition&#xff0c;对于注册及获取bean都是使用从父类DefaultListableBeanFactory继承的方法去实现。 xmlBeanFactory 主要是使用reader属性对资源文件进行读取和注册。 2.…

VMware ESXi 6.7 U3 Final - ESXi 6 系列最终版下载

VMware ESXi 6.7 U3 Final - ESXi 6 系列最终版下载 VMware ESXi 6 Standard 请访问原文链接&#xff1a;https://sysin.org/blog/vmware-esxi-6/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org VersionRelease NameRelease …

APIO2023 游记

GDOI 和 GDKOI 的游记都咕咕咕了&#xff0c;而且都炸了&#xff0c;APIO 的游记提前发&#xff0c;就是要破釜沉舟。 我是线上选手。 Day -7 我们原题检测&#xff0c;阿克了&#xff0c;毕竟是原题&#xff0c;虽然有两道博弈论黑题确实挺毒瘤的。 教练让我做 APIO2012 的…

centos8安装mysql8

本次介绍捆绑包rpm方式安装mysql 首先到mysql官网:MySQL 1.下载捆绑包 2.上传至服务器 3.解压 tar -xvf mysql捆绑包.tar 4.重点来了,按照以下顺序分别安装(命令中的版本号按照自己下载的版本调整) rpm -ivh mysql-community-common-8.0.26-1.el7.x86_64.rpm rpm -ivh my…

东南亚市场攻略:如何利用海外网红实现品牌曝光与销售增长

在当今数字化时代&#xff0c;社交媒体的兴起改变了品牌推广和市场开发的方式。尤其是在东南亚地区&#xff0c;网红营销迅速发展&#xff0c;成为品牌开发该地市场的重要策略之一。本文Nox聚星将和大家详细探讨出海品牌该如何利用海外网红营销来开发东南亚市场。 ​一、东南亚…

怎么做邮件营销?邮件营销必备攻略

电子邮件营销是与受众沟通、建立关系和推动转化有效的方式之一。然而&#xff0c;撰写有效的电子邮件营销活动需要创造力和方法技巧的结合。做好电子邮件营销能够为企业带来长期的客源&#xff0c;并为其培养稳定优质的客户&#xff0c;为企业带来长期收益。在这篇文章中&#…

这样做WhatsApp群组营销,转化率猛UP

WhatsApp群组营销是一种利用WhatsApp群组进行推广和营销活动的策略。通过创建或参与相关主题的群组&#xff0c;您可以与潜在客户建立联系&#xff0c;传递信息并促进销售。 以下是一些WhatsApp群组营销的建议&#xff1a; 1.确定目标受众&#xff0c;建立目标群组&#xff1a…

2023天一永安杯部分wp

web Query 布尔盲注 import requests import stringdictionary string.digitsstring.ascii_letters"_-{,}" url "http://cd5a2660b462c867.node.nsctf.cn/login.php" xxx"" for i in range(1,666):print("正在爆破第{}位".format…

关闭eslint - vue篇

文章目录 一、问题描述二、问题解决1、首先是比较旧的vue项目2、创建项目的时候&#xff0c;不要选eslint3、如果你使用的编辑软件是webstorm4、创建的项目没有webpack.base.conf.js文件&#xff0c;但是有 .eslintrc.js5、比较新的vue项目&#xff0c;目录没有&#xff08;直接…

升级iOS16.5后无法使用闪电转USB3相机转换器怎么办?

上周&#xff0c;苹果给大家推送了iOS 16.5更新&#xff0c;号称修复了超14个漏洞。但很快&#xff0c;安装了更新的iPhone和iPad用户发现iOS 16.5的一个BUG&#xff0c;Lightning转USB 3相机转换器无法工作。 使用闪电转 USB 3 相机转换器&#xff0c;你可以轻松地将照片和视…

云时通供应链中台 | 打造供应链智慧大脑,实现70%订单交易自动化

在外部环境巨变的三年中&#xff0c;有些消费品制造和零售企业却仍然在自己的赛道逆势增长&#xff0c;这些企业无一例外先一步通过数字化武装自身&#xff0c;打造供应链护城河&#xff0c;为企业实现降本增效。 供应链和物流服务&#xff0c;是商业活动最底层的支撑系统之一…

Postman接口工具、中的全局/环境/集合变量的使用及优先级

变量的使用场景 Postman的变量主要用于参数化和关联 应用1: 常用变量可以按使用范围设置成集合或全局变量应用2: 一套接口要在不同的环境上测试时, 可以新建两个环境,比如test环境和stage环境, 两个环境中添加base_url变量并设置不同的值, 请求中接口的url中使用{{base_url}},…