RedRock的第一次作业

 

算是写一下题解,一共六项作业,,除了最后一个最长回文子串都写了,,,我得留点时间给高数作业

环境:

go version go1.15.2 linux/amd64

wsl Arch

vscode + goimport

在线题解: 我的blog

lv0 -“hello, world!”

Golang版本的hello world,有种写C++的错觉

package main

import "fmt"

func main() {
  fmt.Println("hello, world!")
}

lv1 -A Simple Calculator

input:

1

+

2

output:

3

输入分三行降低了处理输入数据的难度(其实并没有)

package main

import "fmt"

func cal(a int, cal string, b int) int {
  switch cal {
  case "+":
    return a + b
  case "-":
    return a - b
  case "*":
    return a * b
  case "/":
    return a / b
  default:
    return 0
  }
}

func main() {
  var a, b int
  var sig string

  // fmt.Scanln(&a, &sig, &b)

  fmt.Scanln(&a)
  fmt.Scanln(&sig)
  fmt.Scanln(&b)

  fmt.Println(cal(a, sig, b))
}

感觉写的好丑……一点也不优雅

lv2 -Password Verifier

咱也不会异常啥的,,往简单里写,,水了水

package main

import "fmt"

func main() {
  user := make(map[string]string)

  user["root"], user["vonhyou"] = "toor", "plmokn"

  fmt.Print("login:")
  var username, pwd string
  fmt.Scanln(&username)

  pwd, ok := user[username]
  if ok {
    fmt.Print("password:")
    fmt.Scanln(&pwd)
    if pwd == user[username] {
      fmt.Println("Welcome", username)
    } else {
      fmt.Println("Wrong password!")
    }
  } else {
    fmt.Println("User does not exist!")
  }
}

lv3 -Get The Largest Number

应该是为了让大家熟悉for循环

写lv3p的时候发现maxn有个小bug

就是flag的初始值给的是假想无穷小,,好久没写代码忘了好多东西啊

package main

import "fmt"

func maxn(arr []int, n int) int {
  var flag int = arr[0]
  for i := 1; i < n; i++ {
    if arr[i] > flag {
      flag = arr[i]
    }
  }
  return flag
}

func main() {
  var n int
  a := make([]int, 10)
  fmt.Scanln(&n)
  for i := 0; i < n; i++ {
    fmt.Scanf("%d", &a[i])
  }
  // fmt.Println(a)
  fmt.Println(maxn(a, n))
  // fmt.Println(a[:n])
}

lv3plus -Sort!

本来搞OI那会排序算法都忘得差不多了,,现在又让写

索性学了学基数排序,实现了一下,,不知道有没有bug

package main

import "fmt"

func maxn(arr []int, n int) int {
  var flag int = arr[0]
  for i := 1; i < n; i++ {
    if arr[i] > flag {
      flag = arr[i]
    }
  }
  return flag
}

func insSort(a []int, exp int, n int) {
  for i := 1; i < n; i++ {
    flag := a[i]
    j := i - 1
    for j >= 0 && a[j]/exp < flag/exp {
      a[j+1] = a[j]
      j--
    }
    a[j+1] = flag
  }
}

func radixSort(a []int, n int) {
  mxn := maxn(a, n)
  mxExp := 1
  for mxn >= 10 {
    mxn /= 10
    mxExp *= 10
  }

  for i := 1; i != mxExp; i *= 10 {
    insSort(a, i, n)
  }
}

func main() {
  var n int
  a := make([]int, 10)
  fmt.Scanln(&n)
  for i := 0; i < n; i++ {
    fmt.Scanf("%d", &a[i])
  }
  radixSort(a, n)
  fmt.Println(a[:n])
}

吐槽:go有好多大括号啊,,,,丑死了,,咋和rust一个德行

懂了,,之前的幻像(感觉像是写C++)是错的,,写go和写rust一样憋屈,,,,,(来自被ruby惯坏的过期薯条)

关于基排的具体实现,可以看Wiki

lv4 -“hello, world!” Web version

package main

import "github.com/gin-gonic/gin"

func main() {
  method := func(c *gin.Context) {
    c.String(200, "hello, world!")
  }
  r := gin.Default()
  r.GET("/", method)
  r.Run()
}

引用了gin这个包,,还有上来就匿名函数的嘛,,,

这里用goland的确方便一点点,但是vscode也差不到哪儿去

主要是新建项目的时候goland可以直接选择go mod

lv5 -Longest Palindromic Substring

也不是不能写暴力,,但是状态一般,,,

留下wiki的链接有时间再看把,,,Manacher当时就没太搞懂

  • Wikipedia Implemented by Java and it has Pseudocode

Concluding Remarks

基本就这样吧,,吐槽归吐槽,,有作业引导的确比自学有效率

学长答疑也很耐心,十分感谢!

唔,,从后端开始,向全栈(full stack)进发!!