楼主昨天参加了bytedance 的视频笔试,今天给大家分享一下,
题目描述:
小Byte想在七夕当天…此处省略三百字…
就是小byte想给小dance写封情书,怕被别人看见,需要加密。
加密法则为:
1. 对每个单词加密
2. 不改变单词的大小写
3. 针对每个单词,从第一个字母开始标序号,到最后一个字母, 取出所有序号为奇数的字母,连起来加密后单词的前半部分; 再倒着取出所有序号为偶数的字母,作为单词的后半部分。
4.例如,abcdefg 加密后的前半部分为 aceg ,后半部分为 fdb , 整个字符串加密后为: acegfdb
设计思路:解密算法需要从加密算法中寻找,我们可以看到,密文分两部分,字符串编号奇数连起来为头部,编号偶数倒序作为尾部,因此,解密算法应该先取出密文的头部和尾部。这里我使用
substring(0,(message.length()+1)/2);
来取密文头部,
substring((message.length()+1)/2);
来取尾部
然后从头部从前往后取chatAt(index)
,尾部从后往前取chatAt(index)
具体算法如下:
private static String decrypt(String message) { //解密算法
String head = message.substring(0,(message.length()+1)/2);
String tail = message.substring((message.length()+1)/2);
StringBuilder stringBuilder = new StringBuilder("");
//System.out.println(head+" "+tail);
int i = 0, j = tail.length()-1;
while(i<head.length()||j>=0){
stringBuilder.append(head.charAt(i));
if(j>=0) {
stringBuilder.append(tail.charAt(j));
}
i++;
j--;
}
return stringBuilder.toString();
}
rs:
请输入密文:
acegfdb
解密结果为:
abcdefg
next
请输入密文:
wloemce to btdnecaey
解密结果为:
welcome to bytedance
立个flag 今天之前楼主会上传本题加密算法。。。
通过解密算法的经验,我们可以一样,new两个StringBuilder对象用来存储加密后的头和尾,然后,再用StringBuilder自带封装的reverse()
方法将尾部的字符串反转,最后连接到头部就行了。
具体实现:
private static String encryption(String message) { //加密算法
StringBuilder head = new StringBuilder("");
StringBuilder tail = new StringBuilder("");
for(int i = 0; i<message.length(); i++){
if(i%2==0){
head.append(message.charAt(i));
}else {
tail.append(message.charAt(i));
}
}
return head.append(tail.reverse()).toString();
}
rs:
请输入需要加密的内容
welcome to bytedance
加密结果为:
wloemce to btdnecaey