牛客巅峰赛:破译密码

题目描述

题面:
牛牛收到了一个任务,任务要求牛牛破译一个密码。牛牛将被给予两个字符串s1和s2,均由四个小写字母构成。需要破译的密码为从s1变换到s2最少需要的变换次数。
变换的方式是这样:每次变换可以选择当前字符串中的一个位置,然后剩下的三个位置的字符从左到右分别加上2,3,5,若是超出’z’,则重新从’a’开始,例如:对于字符串"abcd",我们选择’c’的位置进行变换,则变换之后的字符串为"ceci";对于字符串"qyzr",我们选择’r’位置进行变换,则变换之后的字符串为"sber"。
来源:牛客网
网址:https://www.nowcoder.com/practice/73733ae4a19d4788b1b501c97b8fa3c8?tpId=185&rp=1&ru=%2Fta%2Fweeklycontest-history&qru=%2Fta%2Fweeklycontest-history%2Fquestion-ranking
示例1
输入:“aaaa”,“ccgk”
输出:2
说明:第一次变换选择第一个’a’,变成"acdf",第二次变换选择第二个’c’,变成"ccgk",故答案为2
备注:
s1,s2均由四个小写字母组成

解析

这个方式就很简单粗暴了,首先我们设计一个index[4]的数组,用来存储s1与s2之间的差值,这样计算增加多少的时候便可以定量计算。利用charAt(i)函数来得到s1与s2同位置的字符。这里一定要+26)%26,因为要考虑负数的情况。

我们设i、 j、 k、 p分别代表选择第0123元素的次数,由于只有26个小写字母,所以 每一层的循环不超过26次,采用四层循环,当index都满足情况时,i+ j+ k+p就是满足题目的一种求解,再用min函数判断最小值。当然也可以这样写res = res < (i + j+ k + p) ? res : (i + j + k + p);

对于第一个元素,除非选择的是第一个位置,其他的第一个位置都加2,所以改变量为2*(j +k + p);
对于第二个元素,选择第一个位置时加2,选择三四位置时加3,所以改变量为2 * i + 3 * (k + p);
对于第三个元素,选择第一个位置和第二个位置时加3,选择第四个位置时加5,所以该变量为3 * (i + j) + 5 * p;
对于第四个元素,除非选择的是第四个位置,其他的第一个位置都加5,所以改变量为5 * (i + j + k);
因为是超过26就循环到a,这时一定要再求一个该变量对于26的余数,只有每一个位置的改变量&&等于index[]的值,才能说变换完成。

import java.util.*
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值