Golang バイト面接体験の共有
最初の面
面接官は最初に、面接は数回行われることを紹介しました
アルゴリズムの質問 1.1
整数を 2 進数に変換してから、負の数を 2 進数に変換します
例
たとえば、n = 1 (1:1 の 2 進数表現)
たとえば、n = 5 (5 の 2 進表現: 101)
たとえば、n = 20 (5 の 2 進表現: 10100)
たとえば、n = 31 (31 の 2 進表現: 11111)
この問題の解決策
ステップ1 * -整数 n を受け入れるメソッドを定義します。
ステップ 2 - golangパッケージを使用してnをバイナリ表現に変換する
ステップ3 * -変換されたバイナリ表現を返します。
package main
import (
"fmt"
"strconv"
)
func IntegerToBinary(n int) string {
return strconv.FormatInt(int64(n), 2)
}
func main() {
n := 1
fmt.Printf("Binary Representation of %d is %s.\n", n, IntegerToBinary(n))
n = 5
fmt.Printf("Binary Representation of %d is %s.\n", n, IntegerToBinary(n))
n = 20
fmt.Printf("Binary Representation of %d is %s.\n", n, IntegerToBinary(n))
n = 31
fmt.Printf("Binary Representation of %d is %s.\n", n, IntegerToBinary(n))
}
PS D:\Workspace\Go\src\projects\demo> go run main.go
Binary Representation of 1 is 1.
Binary Representation of 5 is 101.
Binary Representation of 20 is 10100.
Binary Representation of 31 is 11111.
int -> bin の変換
正の整数、負の整数、0 変換が含まれます
package main
import (
"fmt"
"strconv"
)
//bin表示转化后的位数
func convertToBin(n int, bin int) string {
var b string
switch {
case n == 0:
for i := 0; i < bin; i++ {
b += "0"
}
case n > 0:
//strcov.Itoa 将 1 转为 "1" , string(1)直接转为assic码
for ; n > 0; n /= 2 {
b = strconv.Itoa(n%2) + b
}
// 加0
j := bin - len(b)
for i := 0; i < j; i++ {
b = "0" + b
}
case n < 0:
n = n * -1
// fmt.Println("变为正数:",n)
s := convertToBin(n, bin)
// fmt.Println("bin:",s)
//取反
for i := 0; i < len(s); i++ {
if s[i:i+1] == "1" {
b += "0"
} else {
b += "1"
}
}
// fmt.Println("~bin :",b)
//转化为整型,之后加1 这里必须要64,否则在转化过程中可能会超出范围
n, err := strconv.ParseInt(b, 2, 64)
if err != nil {
fmt.Println(err)
}
//转为bin
//+1
b = convertToBin(int(n+1), bin)
}
return b
}
func main() {
fmt.Println(
convertToBin(5, 2), //101
convertToBin(13, 2), //1101
convertToBin(11111, 2),
convertToBin(0, 2),
convertToBin(1, 2),
convertToBin(-5, 2),
convertToBin(-11111, 2),
)
}
たとえば、-11111 の変換は次のようになります。
正の数になる: 11111 bin: 10101101100111 ~bin : 01010010011000 結果: 1010010011001
正の数は元のコードで表され、負の数は補数コードで表され、補数コード = 逆コード + 1
アルゴリズム問題 1.2
株式の売買の最大利益 株式の
毎日の価格を表す配列が与えられた場合、複数回売買した場合の最大利益はいくらでしょうか?
日付が重ならない場合、複数回売買できますか? 入力: {100, 80, 120, 130, 70, 60, 100, 125} 複数回売買できます: 115 ( 80
で買い; 60 で買い、 125 で売る) ヒント: 売買のシーケンスを出力する必要はありません。最大の利益を得る必要があるだけです。
時間計算量とは何ですか。
空間計算量とは何ですか。
ワンパス方式。
トラバースするときは、0 より大きいすべての [prices[i]-prices[i-1]] を累積します。この累積された値が、返される必要がある値になります。
時間計算量: O(N)。空間複雑度: O(1)。
package main
import (
"fmt"
)
func main() {
arr := []int{100, 80, 120, 130, 70, 60, 100, 125}
ret := maxProfit(arr)
fmt.Println(ret)
}
func maxProfit(prices []int) int {
N := len(prices)
if N <= 1 {
return 0
}
ans := 0
for i := 1; i < N; i++ {
ans += getMax(prices[i]-prices[i-1], 0)
}
return ans
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
PS D:\Workspace\Go\src\projects\demo> go run main.go
115
1 回だけ取引する場合:
問題解決のアイデア:株価の最低点で買って最高値で売れば最大の利益が得られる(売買手数料に関係なく)
利益 = 販売価格 (最大値) - 購入価格 (最小値)。
コードの実装は次のとおりです。 アルゴリズムは O(n) の時間計算量を実装します。
func maxProfitOneDeal(prices []int) (profit int) {
if len(prices) == 0 {
return 0
}
purchase, sell := prices[0], prices[0] //初始化:purchase:购买,sell:卖出
for _, price := range prices {
if price < purchase { // 如果当前股票价格小于买入价格,那么将当前价格赋值给买入价格
purchase = price
sell = 0
} else if price > sell { // 如果当前股票价格大于卖出价格,那么将当前价格赋值给卖出价格
if sell-purchase > profit {
profit = sell - purchase // 利润=卖出价格-买入价格
}
}
}
// fmt.Println("profit", profit)
return profit
}
func main() {
arr := []int{100, 80, 120, 130, 70, 60, 100, 125}
ret := maxProfit(arr)
fmt.Println(ret)
ret1 := maxProfitOneDeal(arr)
fmt.Println(ret1)
ret2 := maxProfitMultiDeal(arr)
fmt.Println(ret2)
}
複数回の取引で得られる最大利益:
問題解決のアイデア: 複数の取引が最も収益性が高く、毎回最低点で購入し、次に高い点で売却するだけで済みます。
数学的極値の考え方を使用して、価格配列の最大値 (売り価格) と最小値 (買い価格) を見つけます。
//forループ内で初日と最終日の株価を取り除き、配列内の最大値と最小値を求めます。
最安値点で買い、最高値点で売る;株価>最終日の購入価格の場合、最終日に売る(最高値点がない場合は、最後の最低値点で買う、それが最終販売日です)。最大の利益。(数学における極値思考)
golang コードは次のように実装されます。アルゴリズムは O(n) の時間計算量を実現します。
//可交易多次,股票交易最大收益
func maxProfitMultiDeal(prices []int) (profit int) {
if len(prices) == 0 {
return 0
}
buy := prices[0] //买入初始值为第一天的股票价格
for i := 1; i < len(prices)-1; i++ {
//如果第i天的股票价格是极小值,赋值给buy,作为买入价格
if prices[i]-prices[i-1] <= 0 && prices[i]-prices[i+1] <= 0 && prices[i] < buy {
buy = prices[i]
// log.Info("buy in第 i天", i)
} else if prices[i]-prices[i-1] > 0 && prices[i]-prices[i+1] >= 0 && prices[i] > buy { //极大值点卖出
profit += (prices[i] - buy)
// log.Info("sell out第 i天", i)
buy = prices[i+1]
}
}
// log.Info("profit", profit)
return profit
}
正誤問題 2.1 このコードの問題点とその解決方法
func main() {
total := 0
sum := 0
for i := 1; i <= 10; i++ {
sum += i
go func() {
total += i
}()
}
fmt.Printf("total:%d sum %d", total, sum)
}
PS D:\Workspace\Go\src\projects\demo> go run main.go
total:0 sum 55