首页 > 其他分享 >OJ中go语法整理

OJ中go语法整理

时间:2022-11-11 08:11:05浏览次数:62  
标签:slice return OJ int fmt 数组 语法 func go

对比Java需要注意的语法细节:

1)没有++i,只能i++;无while循环,可以用“for 条件”替代,无法定义不使用的变量;没有整型变量的max,min,abs函数;
2)数组的大小不是常量的话,需要通过make关键字定义slice进行替代;没有类只有func,类可以通过struct关键字替代。
3)go中没有初始化的slice,map,channel用nil关键字进行判断

go中特殊关键字:

关键字
range 迭代array,slice,channel,map,对arry返回索引,数值,对于map返回key,value
append append(slice,ele),为slice添加ele元素
// range语法,其中,i是索引,num是元素值
for i, num := range nums {}

基本模板

package main
import "fmt"
import "sort"
//import "math"
//import "strings"

func main(){
    var N,K int
    fmt.Scanf("%d %d",&N,&K)
    arr := make([]int,N)
    for i := 0;i < N;i++{
        fmt.Scan(&arr[i])
    }
    sort.Ints(arr)
    
    maxv := 0
    fmt.Printf("%d",maxv);
    
    
}

func min(a, b int) int { if b > a { return a }; return b }
func max(a, b int) int { if b > a { return b }; return a }
func abs(a int) int { if a > 0 { return a}; return -a }

1 输入输出(OJ

官方标准库手册组成

package fmt主要有四部分组成,分别是Constants、Variables,Functions,Types,其中
前面三个是包中定义的常量、变量、函数,较为容易理解。最后的Types定义了这个包中的inteface。

输入函数

  • 输入输出需要引入fmt包
fmt.Scan(&N)
-----------------------------
var cap,val [3]int
for i := 0;i < 3;i++{
	fmt.Scanf("%d %d",&cap[i],&val[i])
}
----------------------------------------
package main
import "fmt"
func main(){
    var N int
    var s string
    fmt.Scan(&N)
    fmt.Scan(&s)
    arr := []byte(s)
    fmt.Printf("%d\n",maxv)
}


func min(a, b int) int { if b > a { return a }; return b }
func max(a, b int) int { if b > a { return b }; return a }

2 字符串

var a = []byte("hello boy")   // string转换字符数组
var b = string(a)             // 字符数组转String
  • go中string是不可变的。

可变字符串

  • 类似于Java中的StringBuilder
  • 需要依赖strings包
var b strings.Builder
b.WriteString("ignition")  // 写入字符串
b.Len()                    // 返回字符串长度
b.String()                 // 返回String类型字符
b.WriteByte(c byte)        // 写入单个字符

3 数组(slice)

数组使用

runtime/slice.go源码

数组和切片区别:

  • The built-in function make(T, args) serves a purpose different from new(T). It creates slices, maps, and channels only, and it returns an initialized (not zeroed) value of type T (not *T)
1)切片时指针类型,数组是值类型 
2)数组的长度是固定的,而切片不是(切片是动态的数组)
3)切片比数组多一个属性:容量(cap) 
4)切片的底层是数组

数组定义

var [3]int              // 定义维度为3的int整型数组    

排序

排序需要引入官方提供的sort包,提供了以下函数:

func Ints(x []int)         // 对整型数组进行升序排序
func Float64s(x []float64) // 对浮点数组进行升序排序
func Strings(x []string)   // Strings sorts a slice of strings in increasing order.
func Slice(x any, less func(i, j int) bool)    // 对slice进行排序,需要自定义bool函数

对自定义结构体排序

  • 要实现Less方法(Sort sorts data in ascending order as determined by the Less method. It makes one call to data.Len to determine n and O(n*log(n)) calls to data.Less and data.Swap. The sort is not guaranteed to be stable.)
func Sort(data Interface)    
// 实例:自定义的结构体基于属性v排序
type pair struct{
    op byte
    v int
}
sort.Slice(arr,func(i,j int) bool{
        return arr[i].v < arr[j].v
})

自定义排序规则的两种方法

二维slice的定义

arr := make([][]int, N) 
for i := range arr { arr[i] = make([]int, 3) } 
----------------------------------------------
for i := 1;i <= 3;i++

slice的拷贝

a := b[:]     // 浅拷贝,共享内存
========================================
b := make([]type,len(b)
copy(a,b)                // 深拷贝                
=========================================

4 math package

定义的常量

MaxInt32  = 1<<31 - 1
MinInt32  = -1 << 31
MaxInt64  = 1<<63 - 1
MinInt64  = -1 << 63

5 map的使用

kvs := make(map[string]int,100)      // 定义一个key是string,value是int类型的map
for k,v := range kvs{}               // 通过range关键字遍历map的key和valu
kvs[k]++                             // 让value增1

6 使用slice建立图的邻接表

    g := make([][]int,N+1)
    for i := 1;i <= N;i++{
        g[i] = make([]int,0,10)   //0 表示实际动态数组长度,10表示初始化的容量,len(slice)获取的是0
    }
g[i] = append(g[i],1)             // 为动态数组添加元素

标签:slice,return,OJ,int,fmt,数组,语法,func,go
From: https://www.cnblogs.com/kfcuj/p/16879420.html

相关文章

  • go workspace 试用
    golangworkspace提供了类似单体仓库管理模块的能力,类似npm的yarnworkspace或者lerna,当然npm也提供了类似的能力,maven,gradle都可以提供类似的能力参考使用项......
  • 使用mod管理go依赖包和gin框架简单应用
     背景:gomod其实就是一个Modules,关于Modules的官方定义为:Modules是相关Go包的集合,是源代码交换和版本控制的单元。简单的说就是一个类似索引文件,里面包含依......
  • golang操作文件或者目录
    使用golang操作文件和目录Go&Rust......
  • 「LOJ2474」北校门的未来
    题目点这里看题目。你有一棵树\(T\),初始时\(T=(V=\{1\},E=\varnothing)\)。你将要进行\(q\)次操作,每次操作的形式为以下两种之一:第一种操作:给定参数\(x,y\),保证......
  • AtCoder Regular Contest 149 D Simultaneous Sugoroku
    很妙的一个题。没法用数据结构直接维护点的移动。可以挖掘一些性质。发现对于两个点\(x\)和\(-x\),它们的移动关于原点对称。可以根据对称性维护森林。维护当前的区间......
  • Python操作MongoDB
    一安装pymongopipinstallpymongo==3.4导入MongoClientfrompymongoimportMongoClient 二连接MongoDB数据库MongoDB端口号:27017连接MongoDB我们需要使用P......
  • 电影推荐系统项目实战:环境配置与搭建:Linux环境下 MongoDB的配置与安装 ----- centos7
    1.在主机中下载好Linux版本的MongoDB压缩包:连接如下:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.3.tgz 2.打开VM,启动虚拟机(这里是hadoop102)......
  • AUSTOj8
    #include <stdio.h>#include <malloc.h>#include <string.h> #define MaxVex 10      //假设当前顶点数最多为10个int visited[MaxVex];    //用来存放当......
  • MongoDB集群之复制集,分片
    目录1集群1.1简介1.2复制集1.2.1简介1.2.2复制集设置1.2.2.1创建目录并启动1.2.2.2配置及初始化1.2.2.3操作节点1.2.2.4不正常关闭服务1.3分片1.3.1简介1.3.2......
  • golang echo group 用法的微妙注意点
    用不好的话,可能会引发很诡异的问题。packagemainimport( "net/http" "github.com/labstack/echo/v4" "github.com/labstack/echo/v4/middleware" "github.com/si......