Edu18 -- Divide by Three --- 题解

目录

Divide by Three:

题目大意:

​编辑​编辑思路解析:

代码实现:


Divide by Three:

题目大意:

        

思路解析:

        一个数字是3的倍数,那么他的数位之和也是3的倍数,所以我们可以O(N)的得到这个数字数位之和模3的结果,如果模3为0,则这个数就是一个美丽的数,如果模3不为0,则他需要取除某些数字.

        那我们想它最多去除几个数字,最多取除两个,因为在模3系统下,任意1-9的数都会等价与1-2,当总体剩下1时,只要有1就删除1,否则就删除两个2,当总体剩下2时,只要有2就删除2,否则就删除两个1,这里删除的1和2是等价的1和2.

        删除之后我们比较这两个情况那个更优秀,删除时从后往前删,因为如果从前往后删,我们还需要考虑删除这个数,后面的是否会变成前缀为0,但是如果从后往前删,就不需要考虑,除非它只能删除这个数使得前缀为0。

        还有特殊情况,删除后没数字剩余了,或者删除后只剩下0了;

代码实现:

        

import java.beans.IntrospectionException;
import java.io.*;
import java.math.BigInteger;
import java.util.*;

public class Main {
    static int tot = 0;
    static int maxn = 123460;
    static int[][] ch;
    static int[] tag;
    static long ans = 0;
    static long[] sum = new long[maxn];
    static int[] arr = new int[maxn];
    static HashMap<Integer, ArrayList<Integer>> map;
    static int k;


    public static void main(String[] args) throws IOException {
        char[] s = f.next().toCharArray();
        int n = s.length;
        int sum = 0;
        int[] cnt = new int[3];
        for (int i = 0; i < n; i++) {
            sum = (sum + s[i] - '0') % 3;
            cnt[(s[i] - '0') % 3]++;
        }
        if (sum == 0){
            for (int i = 0; i < n; i++) {
                w.print(s[i]);
            }
            w.flush();
            w.close();
            return;
        }
        char[] ans = new char[n];
        char[] res = new char[n];
        int p = 0;
        int q = 0;
        if (sum == 1){
            if (cnt[1] >= 1){
                int tag = 1;
                for (int i = n-1; i >= 0; i--) {
                    if ((s[i] - '0') % 3 == 1 && tag >= 1){
                        tag--;
                    }else ans[p++]= s[i];
                }
            }
            if (cnt[2] >= 2){
                int tag = 2;
                for (int i = n-1; i >= 0; i--) {
                    if ((s[i] - '0') % 3 == 2 && tag >= 1){
                        tag--;
                    }else res[q++]= s[i];
                }
            }


        }else {
            if (cnt[1] >= 2){
                int tag = 2;
                for (int i = n-1; i >= 0; i--) {
                    if ((s[i] - '0') % 3 == 1 && tag >= 1){
                        tag--;
                    }else ans[p++]= s[i];
                }
            }
            if (cnt[2] >= 1){
                int tag = 1;
                for (int i = n-1; i >= 0; i--) {
                    if ((s[i] - '0') % 3 == 2 && tag >= 1){
                        tag--;
                    }else res[q++]= s[i];
                }
            }
        }
        int flag1 = 0, flag2 = 0;
        while (p >= 1 && ans[p - 1] == '0') {p--; flag1 = 1;}
        while (q >= 1 && res[q - 1] == '0') {q--; flag2 = 1;}
        if (flag1 == 1 && p == 0) ans[p++] ='0';
        if (flag2 == 1 && q == 0) res[q++] ='0';
        if (p == 0 && q == 0) w.println(-1);
        else {
            if (q > p){
                for (int i = q - 1; i >= 0; i--) {
                    w.print(res[i]);
                }
            }else {
                for (int i = p - 1; i >= 0; i--) {
                    w.print(ans[i]);
                }
            }
        }
        w.flush();
        w.close();

    }
    public static void get(int x, int r, int p , int cur, long res){

        if (res >= k && tag[p] == 1){
            ArrayList<Integer> list = map.get(p);
            for (Integer l : list) {
                ans = Math.max(ans, (sum[r] - sum[l - 1]) / (r - l + 1));
            }
        }
        if (cur < 0)return;
        int c = (x >> cur) & 1;
        if (ch[p][1 - c] != 0 && res + (1L << (cur + 1)) - 1>= k) get(x, r, ch[p][1 - c], cur-1, res + (1L <<cur));
        if (ch[p][c] != 0 && res + (1L << (cur)) - 1 >= k) get(x, r, ch[p][c], cur-1, res);
    }
    public static void insert(int x, int id){
        int p = 0;
        for (int i = 30; i >= 0; i--) {
            int c = ((x >> i) & 1);
            if (ch[p][c] == 0) ch[p][c] = ++ tot;
            p = ch[p][c];
        }
        tag[p] = 1;
        if (map.containsKey(p)){
            ArrayList<Integer> list = map.get(p);
            list.add(id);
        }else {
            ArrayList<Integer> list = new ArrayList<>();
            list.add(id);
            map.put(p, list);
        }
    }
    public static long qkm(long a, long mod){
        long res = 1;
        long b = mod - 2;
        while(b > 0){
            if ((b & 1) == 1) res = (res * a) % mod;
            a = (a * a) % mod;
            b >>= 1;
        }
        return res;
    }
    static PrintWriter w = new PrintWriter(new OutputStreamWriter(System.out));
    static Input f = new Input(System.in);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    static class Input {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public Input(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        public String nextLine() {
            String str = null;
            try {
                str = reader.readLine();
            } catch (IOException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            return str;
        }

        public int nextInt() {
            return Integer.parseInt(next());
        }

        public long nextLong() {
            return Long.parseLong(next());
        }

        public Double nextDouble() {
            return Double.parseDouble(next());
        }

        public BigInteger nextBigInteger() {
            return new BigInteger(next());
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安信可IDE(AiThinker_IDE)编译ESP8266工程方法

0 工具准备 AiThinker_IDE.exe ESP8266工程源码 1 安信可IDE&#xff08;AiThinker_IDE&#xff09;编译ESP8266工程方法 1.1 解压ESP8266工程文件夹 我们这里使用的是NON-OS_SDK&#xff0c;将NON-OS_SDK中的1_UART文件夹解压到工作目录即可 我这里解压到了桌面&#xff0c…

WiFi模块助力少儿编程:创新学习与实践体验

随着科技的飞速发展&#xff0c;少儿编程已经成为培养孩子们创造力和问题解决能力的重要途径之一。在这个过程中&#xff0c;WiFi模块的应用为少儿编程领域注入了新的活力&#xff0c;使得学习编程不再是单一的代码教学&#xff0c;而是一个充满创新与实践的综合性体验。 物联网…

Redis作为缓存的数据一致性问题

背景 使用Reids作为缓存的原因&#xff1a; 在高并发场景下&#xff0c;传统关系型数据库的并发能力相对比较薄弱&#xff08;QPS不能太大&#xff09;&#xff1b; 使用Redis做一个缓存。让用户请求先打到Redis上而不是直接打到数据库上。 但是如果出现数据更新操作&#xff…

开发指南002-前后端信息交互规范-概述

前后端之间采用restful接口&#xff0c;服务和服务之间使用feign。信息交互遵循如下平台规范&#xff1a; 前端&#xff1a; 建立api目录&#xff0c;按照业务区分建立不同的.js文件&#xff0c;封装对后台的调用操作。其中qlm*.js为平台预制的接口文件&#xff0c;以qlm_user.…

【红外与可见光融合:条件学习:实例归一化(IN)】

Infrared and visible image fusion based on a two-stage class conditioned auto-encoder network &#xff08;基于两级类条件自编码器网络的红外与可见光图像融合&#xff09; 现有的基于自动编码器的红外和可见光图像融合方法通常利用共享编码器从不同模态中提取特征&am…

arduino安装索尼spresense开发库

arduino安装索尼spresense开发库 一.库安装二.库文件下载1.直接下载2.git下载1.git加速下载2.git下载加速3.将文件导入arduino 一.库安装 打开arduino点击文件->首选项 将以下链接添加进附加开发板管理器网址 https://github.com/sonydevworld/spresense-arduino-compatib…

什么是数据采集与监视控制系统(SCADA)?

SCADA数据采集是一种用于监控和控制工业过程的系统。它可以实时从现场设备获得数据并将其传输到中央计算机&#xff0c;以便进行监控和控制。SCADA数据采集系统通常使用传感器、仪表和控制器收集各种类型的数据&#xff0c;例如温度、压力、流量等&#xff0c;然后将这些数据汇…

【李沐】动手学习ai思路softmax回归实现

来源&#xff1a;https://www.cnblogs.com/blzm742624643/p/15079086.html 一、从零开始实现 1.1 首先引入Fashion-MNIST数据集 1 import torch 2 from IPython import display 3 from d2l import torch as d2l 4 5 batch_size 256 6 train_iter, test_iter d2l.load_data…

tcp流式服务和粘包问题

目录 1.概念 2.流式服务 3.粘包问题 1.概念 套接字是一个全双工的 使用TCP协议通信的双方必须先建立连接,然后才能开始数据的读写,双方都必须为该连接分配必要的内核资源,以管理连接的状态和连接上数据的传输. TCP连接是全双工的,即双方的数据读写可以通过一个连接进行,完成…

集合框架(一)List系列集合

特点 有序&#xff0c;可重复&#xff0c;有索引。 LIst集合的特有方法 /** 目标&#xff1a;掌握List系列集合的特点&#xff0c;以及其提供的特有方法* */import java.util.ArrayList; import java.util.List;public class ListTest1 {public static void main(String[] arg…

android开发环境搭建

android开发环境搭建 Android 开发环境搭建1.JDK安装与配置1.1 Jdk官方下载1.2 JDK安装1.3 环境变量配置1.4 新建JAVA_HOME1.5 修改Path变量1.6 新建classpath1.7 验证环境是否配置完成 2.开发工具二选一1.如何创建一个工程2.工程的目录结构的了解3.与开发的相关的常规视图4.我…

记录WiFi转WDS桥接再转网线

第一步&#xff1a; 把LAN口修改为 和 主路由器的前三位段位编码一致&#xff0c;最后一位设置大于250&#xff0c;减少抢IP的可能性。这个步骤是修改 桥接路由器的登录IP 第二部&#xff1a; 设置IP池。网关和dns服务器都是同一个&#xff0c;用手机连接主路由器wifi可以找到 …

【Flink】Flink 的八种分区策略(源码解读)

Flink 的八种分区策略&#xff08;源码解读&#xff09; 1.继承关系图1.1 接口&#xff1a;ChannelSelector1.2 抽象类&#xff1a;StreamPartitioner1.3 继承关系图 2.分区策略2.1 GlobalPartitioner2.2 ShufflePartitioner2.3 BroadcastPartitioner2.4 RebalancePartitioner2…

HTML 学习笔记(五)超链接

HYperText 超文是用超链接的方式&#xff0c;将不同空间的文字信息组合在一起的网状文其就像一个桥梁&#xff0c;建立了不同页面中的联系&#xff0c;实现了访问不同网站中页面的功能 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

深度学习+感知机

深度学习感知机 1感知机总结 2多层感知机1XOR2激活函数3多类分类总结 3代码实现 1感知机 是个很简单的模型,是个二分类的问题。 感知机&#xff08;perceptron&#xff09;是Frank Rosenblatt在1957年提出的一种人工神经网络&#xff0c;被视为一种最简单形式的前馈神经网络&…

【C语言】深入理解指针(进阶篇)

一、数组名的理解 数组名就是地址&#xff0c;而且是数组首元素的地址。 任务&#xff1a;运行以下代码&#xff0c;看数组名是否是地址。 #include <stdio.h> int main() {int arr[] { 1,2,3,4,5,6,7,8,9,0 };printf("&arr[0] %p\n", &arr[0]);pri…

[Java安全入门]三.CC1链

1.前言 Apache Commons Collections是一个扩展了Java标准库里的Collection结构的第三方基础库&#xff0c;它提供了很多强大的数据结构类型和实现了各种集合工具类。Commons Collections触发反序列化漏洞构造的链叫做cc链&#xff0c;构造方式多种&#xff0c;这里先学习cc1链…

Dubbo-记录

1.概念 Apache Dubbo 是一款 RPC 服务开发框架&#xff0c;用于解决微服务架构下的服务治理与通信问题&#xff0c;官方提供了 Java、Golang 等多语言 SDK 实现。使用 Dubbo 开发的微服务原生具备相互之间的远程地址发现与通信能力&#xff0c; 利用 Dubbo 提供的丰富服务治理…

C语言--函数指针变量和函数指针数组的区别(详解)

函数指针变量 函数指针变量的作用 函数指针变量是指向函数的指针&#xff0c;它可以用来存储函数的地址&#xff0c;并且可以通过该指针调用相应的函数。函数指针变量的作用主要有以下几个方面&#xff1a; 回调函数&#xff1a;函数指针变量可以作为参数传递给其他函数&…

【数仓】通过Flume+kafka采集日志数据存储到Hadoop

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…