【Go语言入门100题】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])
}
  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小生凡一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值