L1-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])
}
《本文》有 7491 条评论