天天看點

【Go語言入門100題】027 出租 (20 分) Go語言 | Golang

L1-027 出租 (20 分) Go語言|Golang

【Go語言入門100題】027 出租 (20 分) Go語言 | Golang

一時間網上一片求救聲,急問這個怎麼破。其實這段代碼很簡單,index數組就是arr數組的下标,index[0]=2 對應 arr[2]=1,index[1]=0 對應 arr[0]=8,index[2]=3 對應 arr[3]=0,以此類推…… 很容易得到電話号碼是18013820100。

本題要求你編寫一個程式,為任何一個電話号碼生成這段代碼 —— 事實上,隻要生成最前面兩行就可以了,後面内容是不變的。

輸入格式:

輸入在一行中給出一個由11位數字組成的手機号碼。

輸出格式:

為輸入的号碼生成代碼的前兩行,其中arr中的數字必須按遞減順序給出。

輸入樣例1:

18013820100      

結尾無空行

輸出樣例1:

int[] arr = new int[]{8,3,2,1,0};
int[] index = new int[]{3,0,4,3,1,0,2,4,3,4,4};      

思路:

讀懂題目很重要!

輸出的第一個清單其實就是這個電話号碼的數字,隻不過是去除了重複的數字再排一下序而已。

那第二個清單其實就是這個電話号碼中的數字在第一個清單的下标位置而已!!

比如說:

index清單的第一個是3,就表示電話号碼的第一個數字是arr清單的下标為3的數字,就是1。

index清單的第二個是0,就表示電話号碼的第二個數字是arr清單的下标為0的數字,就是8。

那我們要做的就是反過來的操作。用這個電話号碼去推這兩個清單

先把第一個清單搞定,第一個清單就是提取出這個電話号碼裡面的數字然後去重再進行排序麻

第二個清單就是在第一個清單的基礎上去周遊這個電話号碼,去查詢這個電話号碼的數字在第一個清單裡面的什麼位置,記錄下标就行了~

代碼如下:

package main

import (
    "fmt"
    "sort"
    "strconv"
)

func main() {
    var str string
    var opList []int
    _,_=fmt.Scan(&str)
    phoneMap := make(map[rune]int)
    for _,i := range str{  //用map去存這個電話的數字
        phoneMap[i-'0'] = 1
    }
    for i:=0;i<=9;i++ {
        if phoneMap[rune(i)] == 1 {
            opList = append(opList, i) //拿到去重後的電話數字清單
        }
    }
    sort.Ints(opList)  // sort正序排
    var opListReserve []int
    for i:=len(opList)-1 ; i>=0 ; i-- {
        opListReserve = append(opListReserve, opList[i]) // 要倒序排
    }
    s:=""
    op := ""
    for _,i:= range opListReserve{
        op+=strconv.Itoa(i)+","
    }
    for _,i := range str{       //周遊一遍電話号碼
        for index,j := range opListReserve{     // 再周遊一遍去重的電話号碼
            if i-'0' == rune(j) {                   // 如果是等于的話,就記錄去重清單中的電話号碼的下标
                s+=strconv.Itoa(index)+","
            }
        }
    }
    fmt.Printf("int[] arr = new int[]{%s};\n",op[:len(op)-1])   // 把最後一個逗号省去了
    fmt.Printf("int[] index = new int[]{%s};",s[:len(s)-1])
}