欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

Go语言算法之寻找数组第二大元素的方法

时间:2022-05-23 17:29:56 其他范文 收藏本文 下载本文

【导语】下面就是小编给大家整理的Go语言算法之寻找数组第二大元素的方法(共10篇),希望您能喜欢!

Go语言算法之寻找数组第二大元素的方法

篇1:Go语言算法之寻找数组第二大元素的方法

作者:books1958 字体:[增加 减小] 类型:

这篇文章主要介绍了Go语言算法之寻找数组第二大元素的方法,以实例形式分析了不排序、只循环一次来实现寻找数组第二大元素的技巧,是比较典型的算法,需要的朋友可以参考下

本文实例讲述了Go语言算法之寻找数组第二大元素的方法,分享给大家供大家参考。具体如下:

该算法的原理是,在遍历数组的时,始终记录当前最大的元素和第二大的元素。示例代码如下:

代码如下:

package demo01

import (

“fmt”

)

func NumberTestBase {

fmt.Println(“This is NumberTestBase”)

nums := []int{12, 24, 2, 5, 13, 8, 7}

fmt.Println(“nums:”, nums)

secondMax := getSecondMaxNum(nums)

fmt.Println(“secondMax=”, secondMax)

}

func getSecondMaxNum(nums []int) int {

length := len(nums)

if length == 0 {

panic(“Slice nums cannot be 0-size.”)

}

if length == 1 {

return nums[0]

}

var max, secondMax int

if nums[0] > nums[1] {

max = nums[0]

secondMax = nums[1]

} else {

max = nums[1]

secondMax = nums[0]

}

for i := 2; i < len(nums); i++ {

if nums[i] > secondMax {

if nums[i] <= max {

secondMax = nums[i]

} else {

secondMax, max = max, nums[i]

}

}

}

return secondMax

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇2:GO语言基础之数组

或许您是从其他语言转到GO语言这边的,那麽在其他语言的影响下您可能会不太适应GO语言的数组,因为GO语言把数组给拆分成了array,slice和map,需要的朋友可以参考下

1.申明一个数组 var a[2] int 或者 a:=[2]int{1,2}

2.数组索引

数组就是索引的来建立如下图

我们再来一个测试

3.go语言可以自动计算数组的长度,譬如你知道数组有几个可以如下申明

代码如下:

a:=[...]int{1,2,3,45}

4.指针数组

代码如下:

a:=[3]int{1,2,3}

var p * [3]int = &a //这种是指针数组 我们看到可以直接输出指向数组的指针

x , y :=1 ,3

a := [...]*int{&x ,&y}

str.Println(a) //输出这样[0xc080000068 0xc080000070]的地址 这就是数组指针

可以用new关键字申明

代码如下:

p := new([10]int)

fmt.Println(p) //&[0 0 0 0 0 0 0 0 0 0] 输出一个指针

多维数组跟其他语言一样

代码如下:

c := [3][2]int{{1: 2}, {2, 1}, {2, 2}}

fmt.Println(c) //输出[[0 2] [2 1] [2 2]]

冒泡算法之go语言版

代码如下:

package main

import “fmt”

func main() {

a := [...]int{3, 2, 5, 8, 6}

fmt.Println(a)

num := len(a)

for i := 0; i < num; i++ {

for j := i + 1; j < num; j++ {

if a[i] < a[j] {

temp := a[i]

a[i] = a[j]

a[j] = temp

}

}

}

fmt.Println(a)

}

篇3:GO语言数组和切片实例详解

这篇文章主要介绍了GO语言数组和切片的用法,以实例形式较为详细的分析了GO语言中数组与切片的创建及使用技巧,是深入学习GO语言的基础,需要的朋友可以参考下

一、数组

与其他大多数语言类似,Go语言的数组也是一个元素类型相同的定长的序列。

(1)数组的创建。

数组有3种创建方式:[length]Type 、[N]Type{value1, value2, ... , valueN}、[...]Type{value1, value2, ... , valueN} 如下:

代码如下:

func test5 {

var iarray1 [5]int32

var iarray2 [5]int32 = [5]int32{1, 2, 3, 4, 5}

iarray3 := [5]int32{1, 2, 3, 4, 5}

iarray4 := [5]int32{6, 7, 8, 9, 10}

iarray5 := [...]int32{11, 12, 13, 14, 15}

iarray6 := [4][4]int32{{1}, {1, 2}, {1, 2, 3}}

fmt.Println(iarray1)

fmt.Println(iarray2)

fmt.Println(iarray3)

fmt.Println(iarray4)

fmt.Println(iarray5)

fmt.Println(iarray6)

}

结果:

[0 0 0 0 0]

[1 2 3 4 5]

[1 2 3 4 5]

[6 7 8 9 10]

[11 12 13 14 15]

[[1 0 0 0] [1 2 0 0] [1 2 3 0] [0 0 0 0]]

我们看数组 iarray1,只声明,并未赋值,Go语言帮我们自动赋值为0。再看 iarray2 和 iarray3 ,我们可以看到,Go语言的声明,可以表明类型,也可以不表明类型,var iarray3 = [5]int32{1, 2, 3, 4, 5} 也是完全没问题的。

(2)数组的容量和长度是一样的。cap() 函数和 len() 函数均输出数组的容量(即长度)。如:

代码如下:

func test6() {

iarray4 := [5]int32{6, 7, 8, 9, 10}

fmt.Println(len(iarray4))

fmt.Println(cap(iarray4))

}

输出都是5。

(3)使用:

代码如下:

func test7() {

iarray7 := [5]string{“aaa”, `bb`, “可以啦”, “叫我说什么好”, “()”}

fmt.Println(iarray7)

for i := range iarray7 {

fmt.Println(iarray7[i])

}

}

二、切片

Go语言中,切片是长度可变、容量固定的相同的元素序列。Go语言的切片本质是一个数组。容量固定是因为数组的长度是固定的,切片的容量即隐藏数组的长度。长度可变指的是在数组长度的范围内可变。

(1)切片的创建。

切片的创建有4种方式:

1)make ( []Type ,length, capacity )

2) make ( []Type, length)

3) []Type{}

4) []Type{value1 , value2 , ... , valueN }

从3)、4)可见,创建切片跟创建数组唯一的区别在于 Type 前的“ [] ”中是否有数字,为空,则代表切片,否则则代表数组。因为切片是长度可变的。如下是创建切片的示例:

代码如下:

func test8() {

slice1 := make([]int32, 5, 8)

slice2 := make([]int32, 9)

slice3 := []int32{}

slice4 := []int32{1, 2, 3, 4, 5}

fmt.Println(slice1)

fmt.Println(slice2)

fmt.Println(slice3)

fmt.Println(slice4)

}

输出为:

[0 0 0 0 0]

[0 0 0 0 0 0 0 0 0]

[]

[1 2 3 4 5]

如上,创造了4个切片,3个空切片,一个有值的切片。

(2)切片与隐藏数组:

一个切片是一个隐藏数组的引用,并且对于该切片的切片也引用同一个数组。如下示例,创建了一个切片 slice0,并根据这个切片创建了2个切片 slice1 和 slice2:

代码如下:

func test9() {

slice0 := []string{“a”, “b”, “c”, “d”, “e”}

slice1 := slice0[2 : len(slice0)-1]

slice2 := slice0[:3]

fmt.Println(slice0, slice1, slice2)

slice2[2] = “8”

fmt.Println(slice0, slice1, slice2)

}

输出为:

[a b c d e] [c d] [a b c]

[a b 8 d e] [8 d] [a b 8]

可见,切片slice0 、 slice1 和 slice2是同一个底层数组的引用,所以slice2改变了,其他两个都会变,

(3)遍历、修改切片:

代码如下:

func test10() {

slice0 := []string{“a”, “b”, “c”, “d”, “e”}

fmt.Println(“n~~~~~~元素遍历~~~~~~”)

for _, ele := range slice0 {

fmt.Print(ele, “ ”)

ele = “7”

}

fmt.Println(“n~~~~~~索引遍历~~~~~~”)

for index := range slice0 {

fmt.Print(slice0[index], “ ”)

}

fmt.Println(“n~~~~~~元素索引共同使用~~~~~~”)

for index, ele := range slice0 {

fmt.Print(ele, slice0[index], “ ”)

}

fmt.Println(“n~~~~~~修改~~~~~~”)

for index := range slice0 {

slice0[index] = “9”

}

fmt.Println(slice0)

}

如上,前三种循环使用了不同的for range循环,当for后面,range前面有2个元素时,第一个元素代表索引,第二个元素代表元素值,使用 “_” 则表示忽略,因为go语言中,未使用的值会导致编译错误。

只有一个元素时,该元素代表索引。

只有用索引才能修改元素。如在第一个遍历中,赋值ele为7,结果没有作用。因为在元素遍历中,ele是值传递,ele是该切片元素的副本,修改它不会影响原本值,而在第四个遍历――索引遍历中,修改的是该切片元素引用的值,所以可以修改。

结果为:

~~~~~~元素遍历~~~~~~

a b c d e

~~~~~~索引遍历~~~~~~

a b c d e

~~~~~~元素索引共同使用~~~~~~

aa bb cc dd ee

~~~~~~修改~~~~~~

[9 9 9 9 9]

(4)、追加、复制切片:

代码如下:

func test11() {

slice := []int32{}

fmt.Printf(“slice的长度为:%d,slice为:%vn”, len(slice), slice)

slice = append(slice, 12, 11, 10, 9)

fmt.Printf(“追加后,slice的长度为:%d,slice为:%vn”, len(slice), slice)

slicecp := make([]int32, (len(slice)))

fmt.Printf(“slicecp的长度为:%d,slicecp为:%vn”, len(slicecp), slicecp)

copy(slicecp, slice)

fmt.Printf(“复制赋值后,slicecp的长度为:%d,slicecp为:%vn”, len(slicecp), slicecp)

}

追加、复制切片,用的是内置函数append和copy,copy函数返回的是最后所复制的元素的数量。

(5)、内置函数append

内置函数append可以向一个切片后追加一个或多个同类型的其他值。如果追加的元素数量超过了原切片容量,那么最后返回的是一个全新数组中的全新切片。如果没有超过,那么最后返回的是原数组中的全新切片。无论如何,append对原切片无任何影响。如下示例:

代码如下:

func test12() {

slice := []int32{1, 2, 3, 4, 5, 6}

slice2 := slice[:2]

_ = append(slice2, 50, 60, 70, 80, 90)

fmt.Printf(“slice为:%vn”, slice)

fmt.Printf(“操作的切片:%vn”, slice2)

_ = append(slice2, 50, 60)

fmt.Printf(“slice为:%vn”, slice)

fmt.Printf(“操作的切片:%vn”, slice2)

}

如上,append方法用了2次,结果返回的结果完全不同,原因是第二次append方法追加的元素数量没有超过 slice 的容量。而无论怎样,原切片slice2都无影响。结果:

slice为:[1 2 3 4 5 6]

操作的切片:[1 2]

slice为:[1 2 50 60 5 6]

操作的切片:[1 2]

希望本文所述对大家的GO语言程序设计有所帮助。

篇4:Go语言创建、初始化数组的常见方式

作者:books1958 字体:[增加 减小] 类型:

Go语言的语法很灵活,以下展示了创建并初始化数组的多种方式:

代码如下:

//数组初始化的各种方式

func arraySliceTest0201() {

//创建数组(声明长度)

var array1 = [5]int{1, 2, 3}

fmt.Printf(“array1--- type:%T n”, array1)

rangeIntPrint(array1[:])

//创建数组(不声明长度)

var array2 = [...]int{6, 7, 8}

fmt.Printf(“array2--- type:%T n”, array2)

rangeIntPrint(array2[:])

//创建数组切片

var array3 = []int{9, 10, 11, 12}

fmt.Printf(“array3--- type:%T n”, array3)

rangeIntPrint(array3)

//创建数组(声明长度),并仅初始化其中的部分元素

var array4 = [5]string{3: “Chris”, 4: “Ron”}

fmt.Printf(“array4--- type:%T n”, array4)

rangeObjPrint(array4[:])

//创建数组(不声明长度),并仅初始化其中的部分元素,数组的长度将根据初始化的元素确定

var array5 = [...]string{3: “Tom”, 2: “Alice”}

fmt.Printf(“array5--- type:%T n”, array5)

rangeObjPrint(array5[:])

//创建数组切片,并仅初始化其中的部分元素,数组切片的len将根据初始化的元素确定

var array6 = []string{4: “Smith”, 2: “Alice”}

fmt.Printf(“array6--- type:%T n”, array6)

rangeObjPrint(array6)

}

//输出整型数组切片

func rangeIntPrint(array []int) {

for i, v := range array {

fmt.Printf(“index:%d value:%dn”, i, v)

}

}

//输出字符串数组切片

func rangeObjPrint(array []string) {

for i, v := range array {

fmt.Printf(“index:%d value:%sn”, i, v)

}

}

希望本文所述对大家的GO语言程序设计有所帮助,

篇5:go语言睡眠排序算法实例分析

作者:feiwen 字体:[增加 减小] 类型:转载

这篇文章主要介绍了go语言睡眠排序算法,实例分析了睡眠排序算法的原理与实现技巧,需要的朋友可以参考下

本文实例讲述了go语言睡眠排序算法,分享给大家供大家参考。具体分析如下:

睡眠排序算法是一个天才程序员发明的,想法很简单,就是针对数组里的不同的数开多个线程,每个线程根据数的大小睡眠,自然睡的时间越长的,数越大,哈哈,搞笑吧,这种算法看起来很荒唐,但实际上很天才,它可以充分利用多核cpu进行计算。

代码如下:

package main

import (

“fmt”

“time”

)

func main {

tab := []int{1, 3, 0, 5}

ch := make(chan int)

for _, value := range tab {

go func(val int){

time.Sleep( int64(val)*10000000 )

fmt.Println(val)

ch <-val

}(value)

}

for _ = range tab {

<-ch

}

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇6:Go语言单链表实现方法

作者:OSC首席键客 字体:[增加 减小] 类型:

1. singlechain.go代码如下:

代码如下:

//////////

//单链表 -- 线性表

package singlechain

//定义节点

type Node struct {

Data int

Next *Node

}

/*

* 返回第一个节点

* h 头结点

*/

func GetFirst(h *Node) *Node {

if h.Next == nil {

return nil

}

return h.Next

}

/*

* 返回最后一个节点

* h 头结点

*/

func GetLast(h *Node) *Node {

if h.Next == nil {

return nil

}

i := h

for i.Next != nil {

i = i.Next

if i.Next == nil {

return i

}

}

return nil

}

//取长度

func GetLength(h *Node) int {

var i int = 0

n := h

for n.Next != nil {

i++

n = n.Next

}

return i

}

//插入一个节点

//h: 头结点

//d:要插入的节点

//p:要插入的位置

func Insert(h, d *Node, p int) bool {

if h.Next == nil {

h.Next = d

return true

}

i := 0

n := h

for n.Next != nil {

i++

if i == p {

if n.Next.Next == nil {

n.Next = d

return true

} else {

d.Next = n.Next

n.Next = d.Next

return true

}

}

n = n.Next

if n.Next == nil {

n.Next = d

return true

}

}

return false

}

//取出指定节点

func GetLoc(h *Node, p int) *Node {

if p < 0 || p > GetLength(h) {

return nil

}

var i int = 0

n := h

for n.Next != nil {

i++

n = n.Next

if i == p {

return n

}

}

return nil

}

2. main.go代码如下:

代码如下:

package main

import “fmt”

import “list/singlechain”

func main() {

//初始化一个头结点

var h singlechain.Node

//往链表插入10个元素

for i := 1; i <= 10; i++ {

var d singlechain.Node

d.Data = i

singlechain.Insert(&h, &d, i)

fmt.Println(singlechain.GetLoc(&h, i))

}

fmt.Println(singlechain.GetLength(&h))

fmt.Println(singlechain.GetFirst(&h))

fmt.Println(singlechain.GetLast(&h))

fmt.Println(singlechain.GetLoc(&h, 6))

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇7:Go语言生成随机数的方法

作者:不吃皮蛋 字体:[增加 减小] 类型:转载

golang生成随机数可以使用math/rand包

代码如下:

package main

import (

“fmt”

“math/rand”

)

func main {

for i:=0; i<10; i++ {

fmt.Println(rand.Intn(100))

}

}

发现这种情况,每次执行的结果一样,不满意

代码如下:

package main

import (

“fmt”

“time”

“math/rand”

)

func main() {

r := rand.New(rand.NewSource(time.Now().UnixNano()))

for i:=0; i<10; i++ {

fmt.Println(r.Intn(100))

}

}

这种方式就可以使用时间种子来获取不同的结果了

希望本文所述对大家的Go语言程序设计有所帮助,

篇8:Go语言实现简单留言板的方法

作者:不吃皮蛋 字体:[增加 减小] 类型:

代码如下:

package main

import (

// “fmt”

“io”

“log”

“net/http”

“text/template”

“time”

“database/sql”

“github.com/ziutek/mymysql/godrv”

)

// 留言结构

type Liuyan struct {

Id int

Name string

Content string

Time int

}

// 显示留言时间

func (l Liuyan) ShowTime() string {

t := time.Unix(int64(l.Time), 0)

return t.Format(“-01-02 15:04:05”)

}

func main() {

godrv.Register(“SET NAMES utf8”)

// 连接数据库

db, err := sql.Open(“mymysql”, “tcp:127.0.0.1:3306*go/root/123456”)

if err != nil {

panic(err)

}

defer db.Close()

// 准备模板

tpl, err := template.New(“liuyanbook”).Parse(html)

if err != nil {

panic(err)

}

// 显示留言页面 /

requestList := func(w http.ResponseWriter, req *http.Request) {

// 查询数据

rows, err := db.Query(“select * from liuyan”)

if err != nil {

log.Fatal(err)

}

defer rows.Close()

// 获取数据

lys := []Liuyan{}

for rows.Next() {

ly := Liuyan{}

err := rows.Scan(&ly.Id, &ly.Name, &ly.Content, &ly.Time)

if nil != err {

log.Fatal(err)

}

lys = append(lys, ly)

}

// 显示数据

err = tpl.ExecuteTemplate(w, “list”, lys)

if err != nil {

log.Fatal(err)

}

}

// 留言页面 /liuyan

requestLiuyan := func(w http.ResponseWriter, req *http.Request) {

err := req.ParseForm()

if err != nil{

log.Fatal(err)

}

if “POST” == req.Method {

if len(req.Form[“name”]) < 1 {

io.WriteString(w, “参数错误!n”)

return

}

if len(req.Form[“content”]) < 1 {

io.WriteString(w, “参数错误!n”)

return

}

name := template.HTMLEscapeString(req.Form.Get(“name”))

content := template.HTMLEscapeString(req.Form.Get(“content”))

// sql语句

sql, err := db.Prepare(“insert into liuyan(name, content, time) values(?, ?, ?)”)

if err != nil {

log.Fatal(err)

}

defer sql.Close()

// sql参数,并执行

_, err = sql.Exec(name, content, time.Now().Unix())

if err != nil {

log.Fatal(err)

}

// 跳转

w.Header().Add(“Location”, “/”)

w.WriteHeader(302)

// 提示信息

io.WriteString(w, “提交成功!n”)

return

}

err = tpl.ExecuteTemplate(w, “liuyan”, nil)

if err != nil {

log.Fatal(err)

}

}

http.HandleFunc(“/”, requestList)

http.HandleFunc(“/liuyan”, requestLiuyan)

err = http.ListenAndServe(“:12345”, nil)

if err != nil {

log.Fatal(“ListenAndServe: ”, err)

}

}

// 网页模板

var html string = `{{define “list”}}{{/* 留言列表页面 */}}

给我留言

{{range .}}

{{.Id}}{{.Name}}{{.Content}}{{.ShowTime}}

{{end}}

{{end}}

{{define “liuyan”}}{{/* 发布留言页面 */}}

姓名:

内容:

{{end}}

希望本文所述对大家的Go语言程序设计有所帮助,

篇9:Go语言生成素数的方法

作者:依山带水 字体:[增加 减小] 类型:转载

这篇文章主要介绍了Go语言生成素数的方法,实例分析了Go语言生成素数的技巧,需要的朋友可以参考下

本文实例讲述了Go语言生成素数的方法,分享给大家供大家参考。具体实现方法如下:

代码如下:

package main

// 生成2, 3, 4, ... 到 channel ‘ch‘中.

func Generate(ch chan<- int) {

for i := 2; ; i++ {

ch <- i // Send ‘i‘ to channel ‘ch‘.

}

}

// 从管道复制值 ‘in‘ 到 channel ‘out‘,

// 移除可整除的数 ‘prime‘.

func Filter(in <-chan int, out chan<- int, prime int) {

for {

i := <-in   // 接收值 ‘in‘.

if i%prime != 0 {

out <- i // 传入 ‘i‘ 到 ‘out‘.

}

}

}

func main {

ch := make(chan int)   // Create a newchannel.

go Generate(ch) // Launch Generate goroutine.

for i := 0; i < 10; i++ {

prime := <-ch

print(prime, “n”)

ch1 := make(chan int)

go Filter(ch, ch1, prime)

ch = ch1

}

}

希望本文所述对大家的Go语言程序设计有所帮助,

篇10:Go语言使用MySql的方法

作者:不吃皮蛋 字体:[增加 减小] 类型:转载

此代码需要先安装mysql的go语言驱动。

首先安装mysql的go语言驱动:

代码如下:

go get github.com/ziutek/mymysql/godrv

示例代码如下:

代码如下:

package users

import (

“database/sql”

“fmt”

_ “github.com/ziutek/mymysql/godrv”

)

const (

DB_NAME = “mysql_database_name”

DB_USER = “mysql_user”

DB_PASS = “mysql_password”

)

type User struct {

Id     int   `json:“id”`

Name string `json:“name”`

Alias  string `json:“alias”`

}

func OpenDB() *sql.DB {

db, err := sql.Open(“mymysql”, fmt.Sprintf(“%s/%s/%s”, DB_NAME, DB_USER, DB_PASS))

if err != nil {

panic(err)

}

return db

}

func UserById(id int) User {

db := OpenDB()

defer db.Close()

row := db.QueryRow(“SELECT `id`, `name`,`alias` FROM `users` WHERE id=?”, id)

user := new(User)

row.Scan(&user.Id, &user.Name, &user.Alias)

return user

}

希望本文所述对大家的Go语言程序设计有所帮助,

GO语言数组和切片实例详解

go语言实现字符串base64编码的方法

GO语言基本数据类型总结

python实现数组插入新元素的方法

培养语言表达能力方法

Go语言中接口组合的实现方法

寻人启事之寻找父母作文

高考古诗词语言鉴赏方法

codeigniter中view通过循环显示数组数据的方法

名人故事之元素周期表的创始人门捷列夫

《Go语言算法之寻找数组第二大元素的方法(通用10篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档