首页 > golang > 【题解】【PTA团体程序设计天梯赛】L1-027 出租 (20 分) Go语言 | Golang
2019
07-30

【题解】【PTA团体程序设计天梯赛】L1-027 出租 (20 分) Go语言 | Golang

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

【题解】【PTA团体程序设计天梯赛】L1-027 出租 (20 分) Go语言 | Golang_倒序

一时间网上一片求救声,急问这个怎么破。其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1index[1]=0 对应 arr[0]=8index[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

那我们要做的就是反过来的操作。用这个电话号码去推这两个列表

  1. 先把第一个列表搞定,第一个列表就是提取出这个电话号码里面的数字然后去重再进行排序
  2. 第二个列表就是在第一个列表的基础上去遍历这个电话号码,去查询这个电话号码的数字在第一个列表里面的什么位置,记录下标就行了~

代码如下:

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])
}
作者:golang中国
golang中国

本文》有 7491 条评论

留下一个回复