Golang每日一练(leetDay0067) 第十行、打家劫舍I

简介: Golang每日一练(leetDay0067) 第十行、打家劫舍I

195. 第十行 Tenth Line


给定一个文本文件 file.txt,请只打印这个文件中的第十行。


示例:


假设 file.txt 有如下内容:


Line 1

Line 2

Line 3

Line 4

Line 5

Line 6

Line 7

Line 8

Line 9

Line 10


你的脚本应当显示第十行:

Line 10


说明:


1. 如果文件少于十行,你应当输出什么?

2. 至少有三种不同的解法,请尝试尽可能多的方法来解题。


代码:

package main
import (
  "bufio"
  "fmt"
  "os"
)
func main() {
  file, _ := os.Open("file.txt")
  defer file.Close()
  scanner := bufio.NewScanner(file)
  lineCount := 0
  for scanner.Scan() {
    lineCount++
    if lineCount == 10 {
      fmt.Println(scanner.Text())
      return
    }
  }
  if err := scanner.Err(); err != nil {
    fmt.Fprintln(os.Stderr, "reading file error:", err)
  }
}


调用系统命令:

awk 'NR == 10' file.txt

tail -n +10 file.txt | head -n 1

sed -n '10p' file.txt

grep '' file.txt | sed -n '10p'

调用代码:

package main
import (
    "fmt"
    "os/exec"
)
func main() {
    cmd := exec.Command("awk", "NR==10", "file.txt")
    output, err := cmd.Output()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Print(string(output))
}





198. 打家劫舍 House Robber


你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。


给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。


示例 1:

输入:[1,2,3,1]

输出:4

解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。

    偷窃到的最高金额 = 1 + 3 = 4 。


示例 2:

输入:[2,7,9,3,1]

输出:12

解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。

    偷窃到的最高金额 = 2 + 9 + 1 = 12 。


提示:

   1 <= nums.length <= 100

   0 <= nums[i] <= 400


代码1: 动态规划

package main
import "fmt"
func rob(nums []int) int {
  n := len(nums)
  if n == 0 {
    return 0
  }
  dp := make([]int, n+1)
  dp[1] = nums[0]
  for i := 2; i <= n; i++ {
    dp[i] = max(dp[i-1], dp[i-2]+nums[i-1])
  }
  return dp[n]
}
func max(x, y int) int {
  if x > y {
    return x
  }
  return y
}
func main() {
  nums := []int{1, 2, 3, 1}
  fmt.Println(rob(nums))
  nums = []int{2, 7, 9, 3, 1}
  fmt.Println(rob(nums))
}


其它写法:

```golang
func rob(nums []int) int {
    if len(nums) == 0 {
        return 0
    }
    if len(nums) == 1 {
        return nums[0]
    }
    dp := make([]int, len(nums))
    dp[0] = nums[0]
    dp[1] = max(nums[0], nums[1])
    for i := 2; i < len(nums); i++ {
        dp[i] = max(dp[i-2]+nums[i], dp[i-1])
    }
    return dp[len(nums)-1]
}
```


代码2: 使用滚动数组优化空间

package main
import "fmt"
func rob(nums []int) int {
  n := len(nums)
  if n == 0 {
    return 0
  }
  var pre, cur int
  cur = nums[0]
  for i := 2; i <= n; i++ {
    cur, pre = max(pre+nums[i-1], cur), cur
  }
  return cur
}
func max(x, y int) int {
  if x > y {
    return x
  }
  return y
}
func main() {
  nums := []int{1, 2, 3, 1}
  fmt.Println(rob(nums))
  nums = []int{2, 7, 9, 3, 1}
  fmt.Println(rob(nums))
}


代码3: 递归+记忆化搜索

package main
import "fmt"
func rob(nums []int) int {
  mem := make([]int, len(nums))
  for i := 0; i < len(mem); i++ {
    mem[i] = -1
  }
  return helper(nums, mem, len(nums)-1)
}
func helper(nums []int, mem []int, i int) int {
  if i < 0 {
    return 0
  }
  if mem[i] >= 0 {
    return mem[i]
  }
  res := max(helper(nums, mem, i-2)+nums[i], helper(nums, mem, i-1))
  mem[i] = res
  return res
}
func max(a, b int) int {
  if a > b {
    return a
  }
  return b
}
func main() {
  nums := []int{1, 2, 3, 1}
  fmt.Println(rob(nums))
  nums = []int{2, 7, 9, 3, 1}
  fmt.Println(rob(nums))
}

输出:

4

12

目录
相关文章
|
Shell Linux 算法
Shell编程——弱数据类型的脚本语言快速入门指南
Shell编程——弱数据类型的脚本语言快速入门指南
195 0
Shell编程——弱数据类型的脚本语言快速入门指南
|
Go Linux Shell
Linux 终端命令之文件浏览(2) more
Linux 终端命令之文件浏览(2) more
173 0
Linux 终端命令之文件浏览(2) more
|
Shell 机器学习/深度学习 Linux
Linux 终端操作命令(2)内部命令
Linux 终端操作命令(2)内部命令
286 0
Linux 终端操作命令(2)内部命令
|
C++ 算法 存储
力扣 C++|一题多解之动态规划专题(2)
力扣 C++|一题多解之动态规划专题(2)
209 0
力扣 C++|一题多解之动态规划专题(2)
|
Python 索引
Python Numpy入门基础(一)创建数组
Python Numpy入门基础(一)创建数组
260 0
Python Numpy入门基础(一)创建数组
|
Java 容器 程序员
Java语言程序设计试卷6套
Java语言程序设计试卷6套
1184 0
Java语言程序设计试卷6套
|
Java Go C++
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
205 0
Golang每日一练(leetDay0120) 反转字符串中的元音字母、前K个高频元素
|
2月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
171 1
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
633 4
Golang语言之管道channel快速入门篇
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
241 4
Golang语言文件操作快速入门篇