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

篇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语言程序设计有所帮助,
★codeigniter中view通过循环显示数组数据的方法
文档为doc格式