樓主昨天參加了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