java实现字符串合并处理
字符串合并处理
http://www.nowcoder.com/questionTerminal/d3d8e23870584782b3dd48f26cb39c8f
笨办法,先找出奇数偶数组,排序后再合起来,针对要求的字符做bit反转处理,最后结果拼起来。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String str = "";
while ((str = reader.readLine()) != null) {
str = String.join("", str.split(" ")); // 合并字符串
str = handlerStr(str);
System.out.println(solution(str));
}
reader.close();
}
public static String solution(String str){
if (null == str || str.length() == 0) return str;
StringBuilder builder = new StringBuilder();
for (int i = 0; i < str.length(); i++) {
// 对16进制的字符处理
if (String.valueOf(str.charAt(i)).matches("[0-9A-Fa-f]")){
int dec = Integer.parseInt(String.valueOf(str.charAt(i)), 16);
dec = reverseBit(dec);
builder.append(Integer.toHexString(dec).toUpperCase());
continue;
}
// 其他字符直接拼接
builder.append(str.charAt(i));
}
return builder.toString();
}
/**
* bit反转,分治法
* @param n
* @return
*/
public static int reverseBit(int n){
n = ((n & 0xc) >>> 2) | ((n & 0x3) << 2);
n = ((n & 0xa) >>> 1) | ((n & 0x5) << 1);
return n;
}
/**
* 字符串奇偶排序
* @param str
* @return
*/
public static String handlerStr(String str){
if (null == str || str.length() == 0) return str;
List<Character> even = new ArrayList<>();
List<Character> odd = new ArrayList<>();
// 找出偶数下标组和奇数下标组
for (int i = 0; i < str.length(); i++) {
if (i % 2 == 0) even.add(str.charAt(i));
else odd.add(str.charAt(i));
}
// 排序
even = even.stream().sorted(Character::compareTo).collect(Collectors.toList());
odd = odd.stream().sorted(Character::compareTo).collect(Collectors.toList());
// 排序后再按原下标位置合并起来
StringBuilder builder = new StringBuilder();
for (int i = 0; i < even.size(); i++) {
builder.append(even.get(i));
if (i < odd.size()) builder.append(odd.get(i));
}
return builder.toString();
}
}
查看11道真题和解析