Google API实战与操作

news2025/1/21 12:58:43

Google api实战与操作

      • 一. Google API 权限配置
      • 二. 操作API
        • 2.1 引入依赖
        • 2.2 导入代码

Google官网

实现一套用java程序控制GoogleAPI实现自动生成监控日报等功能,具体能操作Gsheet及document

一. Google API 权限配置

打开上面官网,新建项目
在这里插入图片描述
启用API
在这里插入图片描述
搜索sheet及document
在这里插入图片描述

在这里插入图片描述.点击试用后进入API界面 点击创建凭据
在这里插入图片描述
创建OAuth 客户端重定向记得跟下面配置一样,因为需要先登录才能授权
在这里插入图片描述
生成完成后点击下载到本地,相当于你的Token
在这里插入图片描述

这时候就可以生成表格了

二. 操作API

2.1 引入依赖

<!--        google文档-->
        <dependency>
            <groupId>com.google.api-client</groupId>
            <artifactId>google-api-client</artifactId>
            <version>1.31.2</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-sheets</artifactId>
            <version>v4-rev614-1.18.0-rc</version>
        </dependency>
        <dependency>
            <groupId>com.google.oauth-client</groupId>
            <artifactId>google-oauth-client-jetty</artifactId>
            <version>1.31.4</version>
        </dependency>
        <dependency>
            <groupId>com.google.cloud</groupId>
            <artifactId>google-cloud-storage</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.google.apis/google-api-services-drive -->
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-drive</artifactId>
            <version>v3-rev197-1.25.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.apis</groupId>
            <artifactId>google-api-services-docs</artifactId>
            <version>v1-rev20220609-2.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.gitlab4j</groupId>
            <artifactId>gitlab4j-api</artifactId>
            <version>5.2.0</version>
        </dependency>
        <dependency>
                <groupId>com.google.cloud</groupId>
                <artifactId>libraries-bom</artifactId>
                <version>25.4.0</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

将上面生成的Token导入项目

2.2 导入代码

package com.shopee.bank.business.utility;

import com.baomidou.mybatisplus.extension.api.R;
import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.extensions.java6.auth.oauth2.AuthorizationCodeInstalledApp;
import com.google.api.client.extensions.jetty.auth.oauth2.LocalServerReceiver;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.json.GoogleJsonResponseException;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.gson.GsonFactory;
import com.google.api.client.util.store.FileDataStoreFactory;
import com.google.api.services.docs.v1.Docs;
import com.google.api.services.docs.v1.DocsScopes;
import com.google.api.services.docs.v1.model.*;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.sheets.v4.Sheets;
import com.google.api.services.sheets.v4.SheetsScopes;
import com.google.api.services.sheets.v4.model.Spreadsheet;
import com.google.api.services.sheets.v4.model.SpreadsheetProperties;
import com.google.api.services.sheets.v4.model.UpdateValuesResponse;
import com.google.api.services.sheets.v4.model.ValueRange;
import com.google.common.collect.Lists;
import io.swagger.models.auth.In;
import lombok.Builder;
import lombok.Data;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author kaiyi.wang
 * @ClassName GoogleSheetUtil.java
 * @Description
 * @createTime 2022/07/05
 */
public class GoogleUtil {

    private static final String APPLICATION_NAME = "Quickstart";
    private static final JsonFactory JSON_FACTORY = GsonFactory.getDefaultInstance();
    private static final String TOKENS_DIRECTORY_PATH = "tokens";

    private static final List<String> SCOPES_READ = Lists.newArrayList(SheetsScopes.SPREADSHEETS_READONLY);
    private static final List<String> SCOPES_CREATE = Lists.newArrayList(SheetsScopes.SPREADSHEETS,DriveScopes.DRIVE_FILE);

    private static final List<String> DOCS_SCOPES = Lists.newArrayList(DocsScopes.all());


    public static final String PHFoldID="1msqpxxxxx9vx82Cln";
    public static final String IDFoldID="1VyxuzHxxxxxxxHR";


    /**
     * TODO 下载的应用授权文件,这里记得换成自己的授权文件
     */
    private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

    private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT,List<String> scopes) throws IOException {
        // Load client secrets.
        InputStream in = GoogleUtil.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        if (in == null) {
            throw new FileNotFoundException("Resource not found: " + CREDENTIALS_FILE_PATH);
        }
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, scopes)
                .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build();
        LocalServerReceiver receiver = new LocalServerReceiver.Builder().setPort(8888).build();
        return new AuthorizationCodeInstalledApp(flow, receiver).authorize("user");
    }

    public static void main(String[] args) throws IOException, GeneralSecurityException {
//       
        createSpreadsheet("测试");
//      
    }

    public static String createSpreadsheet(String title) throws IOException, GeneralSecurityException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        // Create the sheets API client
        Sheets service = new Sheets.Builder(new NetHttpTransport(),
                GsonFactory.getDefaultInstance(),
                getCredentials(HTTP_TRANSPORT,SCOPES_CREATE))
                .setApplicationName("Sheets samples")
                .build();
        // Create new spreadsheet with a title
        Spreadsheet spreadsheet = new Spreadsheet()
                .setProperties(new SpreadsheetProperties()
                        .setTitle(title));
        spreadsheet = service.spreadsheets().create(spreadsheet)
                .setFields("spreadsheetId")
                .execute();
        // Prints the new spreadsheet id
        System.out.println("Spreadsheet ID: " + spreadsheet.getSpreadsheetId());
        return spreadsheet.getSpreadsheetId();
    }

        public static void updateSheet(String sid,List<List<Object>> writeData,String dimension,String writeRange) throws IOException, GeneralSecurityException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        // Create the sheets API client
        Sheets service = new Sheets.Builder(new NetHttpTransport(),
                GsonFactory.getDefaultInstance(),
                getCredentials(HTTP_TRANSPORT,SCOPES_CREATE))
                .setApplicationName("Sheets samples")
                .build();
        writeSomething(writeData, service, sid,dimension,writeRange);
    }

    //COLUMNS / ROWS
    public static void writeSomething(List<List<Object>> myData, Sheets service, String sid,String dimension,String writeRange) {
        try {
//            String writeRange = "工作表1!A:F";
            ValueRange vr = new ValueRange().setValues(myData).setMajorDimension(dimension);
            UpdateValuesResponse raw = service.spreadsheets().values()
                    .update(sid, writeRange, vr)
                    .setValueInputOption("RAW")
                    .execute();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Data
    @Builder
    public static class VInfo{
        private String name;
        private String count;
    }

    /**
     * A1 符号
     * 一种语法,用于使用包含工作表名称以及使用列字母和行号的开始和结束单元格坐标的字符串来定义单元格或单元格范围。在引用绝对范围的单元格时,此方法最常见且最有用。
     *
     * 显示示例
     * Sheet1!A1:B2指的是 Sheet1 前两行中的前两个单元格。
     * Sheet1!A:A指 Sheet1 第一列中的所有单元格。
     * Sheet1!1:2指 Sheet1 前两行中的所有单元格。
     * Sheet1!A5:A指的是工作表 1 第一列的所有单元格,从第 5 行开始。
     * A1:B2指第一个可见工作表的前两行中的前两个单元格。
     * Sheet1指 Sheet1 中的所有单元格。
     * 'My Custom Sheet'!A:A指名为“我的自定义工作表”的工作表第一列中的所有单元格。带有空格、特殊字符或字母数字组合的工作表名称需要单引号。
     * 'My Custom Sheet'指“我的自定义工作表”中的所有单元格。
     * 提示:在可能的情况下,为电子表格中的对象使用不同的名称。例如,A1 指的是第一个可见工作表中的单元格 A1,而“A1”指的是名为 A1 的工作表中的所有单元格。同样,Sheet1 引用 Sheet1 中的所有单元格。但是,如果有一个名为“Sheet1”的命名范围,则 Sheet1 指的是命名范围,而“Sheet1”指的是工作表。
     * @throws GeneralSecurityException
     * @throws IOException
     */

    // 读取电子表格
    public static void readSheet() throws GeneralSecurityException, IOException {
        // Build a new authorized API client service.
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
        final String spreadsheetId = "1XiZZT2ctZ8JMjGy2GYOPmsat5CD24U9r0wo6vro-z9Q";    // 这个是官方的 spreadsheetId,读取自己的Google Sheet换成对应ID即可
        final String range = "aml_process_tab!A1:F12"; // 读取的表格范围,命名规范: {sheet表名称}!{开始单元格}:{结束单元格}
        Sheets service = new Sheets.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,SCOPES_READ))
                .setApplicationName(APPLICATION_NAME)
                .build();

        ValueRange response = service.spreadsheets().values()
                .get(spreadsheetId, range)
                .execute();
        List<List<Object>> values = response.getValues();
        if (values == null || values.isEmpty()) {
            System.out.println("No data found.");
        } else {
            for (List row : values) {
                for (int i = 0; i < row.size(); i++) {
                    System.out.print(row.get(i) + "\t\t");
                }
                System.out.println("");
            }
        }
    }

    public static List<String> moveFileToFolder(String fileId, String folderId)
            throws IOException, GeneralSecurityException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

        Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,SCOPES_CREATE))
                .setApplicationName(APPLICATION_NAME)
                .build();

        // Retrieve the existing parents to remove
        File file = service.files().get(fileId)
                .setFields("parents")
                .execute();
        StringBuilder previousParents = new StringBuilder();
        for (String parent : file.getParents()) {
            previousParents.append(parent);
            previousParents.append(',');
        }
        try{
            // Move the file to the new folder
            file = service.files().update(fileId, null)
                    .setAddParents(folderId)
                    .setRemoveParents(previousParents.toString())
                    .setFields("id, parents")
                    .execute();

            return file.getParents();
        }catch (GoogleJsonResponseException e) {
            // TODO(developer) - handle error appropriately
            System.err.println("Unable to move file: " + e.getDetails());
            throw e;
        }
    }



    /**
     * 复制文件到目标目录下
     * @param documentId 目标docs
     * @param foldID 迁移目录
     * @param copyName 复制文件后的名字
     * @throws GeneralSecurityException
     * @throws IOException
     */
    public static String copyDocs(String documentId,String foldID,String copyName) throws GeneralSecurityException, IOException {
        final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
//        Docs service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES))
//                .setApplicationName(APPLICATION_NAME)
//                .build();
        Drive service = new Drive.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES))
                .setApplicationName(APPLICATION_NAME)
                .build();
        File copyMetadata = new File().setName(copyName);
        File documentCopyFile =
                service.files().copy(documentId, copyMetadata).execute();
        String documentCopyId = documentCopyFile.getId();
        moveFileToFolder(documentCopyId, foldID);
        return documentCopyId;
    }

    private static Docs getDocsService()  {
        final NetHttpTransport HTTP_TRANSPORT;
        Docs service;
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            service = new Docs.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT,DOCS_SCOPES))
                    .setApplicationName(APPLICATION_NAME)
                    .build();
        } catch (GeneralSecurityException | IOException e) {
            throw new RuntimeException(e);
        }
        return service;
    }

    /**
     * 指定索引处插入文本
     * @param docsId
     * @param index 文字的索引 从0开始
     * @param text 插入文本
     * @throws IOException
     */
    public static void updateDocs(String docsId, Integer index, String text) throws IOException {
        Docs service = getDocsService();
        List<Request> requests = new ArrayList<>();
        requests.add(new Request().setInsertText(new InsertTextRequest()
//                .setText("07.18~07.24")
                .setText(text)
//                .setLocation(new Location().setIndex(2))));
                .setLocation(new Location().setIndex(index))));

        BatchUpdateDocumentRequest body = new BatchUpdateDocumentRequest().setRequests(requests);
        BatchUpdateDocumentResponse response = service.documents()
                .batchUpdate(docsId, body).execute();
        System.out.println("updated: "+response.getDocumentId());
    }

    /**
     * 最末尾处插入空表格
     * @param docsId
     * @throws IOException
     */
    public static void insertSheetInDocs(String docsId) throws IOException {
        Docs service = getDocsService();

        List<Request> requests = new ArrayList<>();
        requests.add(
                new Request()
                        .setInsertTable(
                                new InsertTableRequest()
                                        .setEndOfSegmentLocation(
                                                new EndOfSegmentLocation())
                                        .setRows(3)
                                        .setColumns(3)));

        BatchUpdateDocumentRequest body =
                new BatchUpdateDocumentRequest().setRequests(requests);
        BatchUpdateDocumentResponse response =
                service.documents().batchUpdate(docsId, body).execute();
    }

    /**
     * docs中表格插入数据 必须倒着写不然索引会变(代码内已处理)
     * @param docsId 操作文档
     * @param indexOfTable 文档中第几个表
     * @param data 行数据
     * @param row 写入第几行数据 注意第一可能为标题
     * @throws IOException 表格若有数据会报错
     */
    public static void updateDocsSheetRow(String docsId,Integer indexOfTable,List<Object> data,int row) throws IOException {
        Docs service = getDocsService();
        // 获取结构
        Document document = service.documents().get(docsId).execute();

        List<StructuralElement> tables = document.getBody().getContent().stream().filter(e -> e.getTable() != null).collect(Collectors.toList());
        if(indexOfTable>=tables.size()){
            throw new IllegalArgumentException("out of size");
        }
        // 获取table
        StructuralElement table = tables.get(indexOfTable);
        // 拿到table行索引
        List<Integer> indexs = table.getTable().getTableRows().get(row).getTableCells().stream().map(TableCell::getStartIndex).collect(Collectors.toList());
        Collections.reverse(indexs);
        Collections.reverse(data);

        List<Request> requests = insertRowList(indexs, data);

        BatchUpdateDocumentRequest body =
                new BatchUpdateDocumentRequest().setRequests(requests);
        BatchUpdateDocumentResponse response = service.documents()
                .batchUpdate(docsId, body).execute();
    }

    public static List<Request> insertRowList(List<Integer> reIndex,List<Object> rowData){
        int i=0;
        List<Request> rows=new ArrayList<>();
        for (Object e : rowData) {
            Request request = new Request().setInsertText(new InsertTextRequest()
                    .setText(String.valueOf(e))
                    .setLocation(new Location().setIndex(reIndex.get(i++)+1)));
            rows.add(request);
        }
//        Collections.reverse(rows);
        return rows;
    }

}

注释都有 凑活看看 下次详细讲解 拉取Grafana自动生成报表

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

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

相关文章

解决umi.js或dva.js中effect函数发生错误dispatch失效的问题

问题背景 在项目的model文件中&#xff0c;通常在effect中进行网络请求等异步操作&#xff0c;当网络错误或者请求结果错误时&#xff0c;以及代码语法错误时&#xff0c;无论是否主动使用throw语句抛出错误&#xff0c;下一次再调用dispatch访问effect中的函数时&#xff0c;…

GRPC 学习记录

GRPC 安装 安装 grpcio、grpcio-tools、protobuf、 pip install grpcio -i https://pypi.tuna.tsinghua.edu.cn/simple pip install grpcio-tools -i https://pypi.tuna.tsinghua.edu.cn/simple pip install protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple常用类型 p…

Spring系列篇 -- Bean的生命周期

目录 经典面试题目&#xff1a; 一&#xff0c;Bean的生命周期图 二&#xff0c;关于Bean的生命周期流程介绍&#xff1a; 三&#xff0c;Bean的单例与多例模式 总结&#xff1a; 前言&#xff1a;今天小编给大家带来的是关于Spring系列篇中的Bean的生命周期讲解。在了解B…

Wlan安全——认证与加密方式(WPA/WPA2)

目录 终端认证技术 WEP认证 PSK认证 802.1x认证与MAC认证 Portal认证 数据加密技术 WEP加密 TKIP加密 CCMP加密 TKIP和CCMP生成密钥所需要的密钥信息 802.11安全标准 WEP共享密钥认证、加密工作原理 WEP共享密钥认证 WEP加解密过程 PSK认证以及生成动态密钥的工…

allegro更新封装如何操作

1、打开brd文件&#xff0c;然后place->update symbols 2、找到要更新的器件

速卖通、阿里国际站需不需要测评?补单或许能带来意想不到的效果

今天和各位聊聊速卖通和阿里国际站&#xff0c;不管新卖家或者老买家都会遇到的各种问题。 首先聊一下新卖家&#xff0c;新卖家店铺刚开&#xff0c;产品先尽可能的去铺开&#xff0c;把店铺规划好&#xff0c;然后就是坐等开单&#xff0c;前期产品上传上去之后是不是感觉流…

比特币凌晨短线暴跌,17万多头爆仓近10亿美元!原因何在?

凌晨5:30AM左右&#xff0c;加密货币短线暴跌。比特币触及24715美元低点&#xff0c;随后回升至26000美元以上&#xff0c;日内跌幅一度扩大至7%以上。以太坊击穿1500美元&#xff0c;现已回调至1650以上&#xff0c;山寨币也出现集体下跌。 此次下跌使比特币市值自6月16日以来…

Linux系统之安装my-mind思维导图工具

Linux系统之安装my-mind思维导图工具 一、my-mind介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查端口占用情况 四、安装httpd4.1 检查本地yum仓库4.2 安装httpd4.3 关闭防火墙和selinux4.4 创建…

C++之atomic_load与atomic_store原子操作实例(一百八十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

4G电力摄像机如何通过AT指令对接到国网平台呢?

对于针对电网安全运行的迫切需求&#xff0c;”输电线路智能可视化监测系统”被研发并应用&#xff0c;通过视频监控和AI智能分析技术&#xff0c;实现了对输电线路远程视频在线监测、外力破坏智能分析&#xff0c;可实现对输电线路的全天候实时监测和预警&#xff0c;有效保障…

【新知测评实验室】解谜扫描全能王——“智能高清滤镜”黑科技

目录 一、“智能高清滤镜” 原理分析1.1、智能扫描引擎AI-Scan功能拆解1.1.1、**图像感知**1.1.2、场景化决策 1.2、版面还原与识别技术分析1.2.1、元素检测和识别1.2.2、元素聚合1.2.3、版面识别 二、深度测评——“智能高清滤镜”功能2.1、图像处理方面2.2、摩尔纹去除方面2.…

五分钟搭建生鲜蔬果小程序

如今&#xff0c;随着移动互联网的快速发展&#xff0c;小程序已经成为众多企业和商家推广产品和服务的重要工具。而生鲜蔬果行业作为一个常见的消费领域&#xff0c;也开始逐渐转向小程序商城来进行销售和服务。那么&#xff0c;如何从零开始搭建一个生鲜蔬果小程序商城呢&…

电力应用 | Intewell操作系统新疆特变项目应用案例

近日&#xff0c;科东软件Intewell操作系统在新疆特变项目成功应用&#xff0c;该方案保障了变电站的电力设备在高电压下稳定运行&#xff0c;实现变电站的智能化控制&#xff0c;极大程度上节省了人力、物力和财力资源&#xff1b;可实时监控电力设备的异常情况&#xff0c;及…

【MT32F006】MT32F006之PWM控制RGB背光灯

本文最后修改时间&#xff1a;2023年06月07日 一、本节简介 本文介绍如何使用MT32F006使用PWM控制RGB灯显示白光&#xff0c;再加上扩散膜、导光板、反光纸、遮光纸&#xff0c;即可作为LCD的背光。 二、实验平台 库版本&#xff1a;V1.0.0 编译软件&#xff1a;MDK5.37 硬…

【24择校指南】齐鲁工业大学计算机考研考情分析

齐鲁工业大学 考研难度&#xff08;☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分析&#xff09;、院校概况、23专业目录、23复试详情、各专业考情分析、各科目考情分析。 正文1140字&#xff0c;预计阅读&#xff1a;3分钟。 2023考情概况 齐鲁工…

将eNSP Pro部署在华为云是什么体验

eNSP Pro简介 eNSP Pro 是华为公司数据通信产品线新推出的数通设备模拟器&#xff0c;主要应用在数据通信技能培训&#xff0c;为使用者提供华为数据通信产品设备命令行学习环境。 具备的能力 多产品模拟能力&#xff1a;支持数据通信产品线NE路由器、CE交换机、S交换机、AR…

Streamlit 讲解专栏(十):数据可视化-图表绘制详解(上)

文章目录 1 前言2 st.line_chart&#xff1a;绘制线状图3 st.area_chart&#xff1a;绘制面积图4 st.bar_chart&#xff1a;绘制柱状图5 st.pyplot&#xff1a;绘制自定义图表6 结语 1 前言 在数据可视化的世界中&#xff0c;绘制清晰、易于理解的图表是非常关键的。Streamlit…

算法笔记:A*算法

A*算法是一种很常用的路径查找和图形遍历算法。它有较好的性能和准确度 1 中心思路 A*算法通过下面这个函数来计算每个节点n的优先级 f(n)g(n)h(n) f(n)是节点n的综合优先级。当选择下一个要遍历的节点时&#xff0c;总会选取综合优先级最高&#xff08;f(n)值最小&#xff0…

算法通关村第三关【黄金】| 数组元素出现次数问题

1.数字出现的次数超过数组长度的一半 方法一、使用Map键值对来记录每个元素出现的次数&#xff0c;返回次数大于一半的 class Solution {public int majorityElement(int[] nums) {Map<Integer,Integer> map new HashMap<>();for(int i 0;i<nums.length;i){m…

解决跨时区跨语言的国外大文件传输问题

随着信息技术的飞速发展和全球化的深入推进&#xff0c;跨国团队、跨国公司之间的合作变得越来越普遍。在这种背景下&#xff0c;大文件的传输成为了一个经常遇到的挑战。跨语言、跨时区的国外大文件传输&#xff0c;由于涉及到复杂的网络环境、不同国家法律法规等多方面的问题…