华为笔试题如下:
Linux shell脚本中${xxx}
代表变量xxx
的值,给定一个字符串中存在一个或多个${xxx}
,需要将字符串中所有的${xxx}
替换成实际值.
示例:
输入:
4
xxx=lyf/${ttt}/test
ttt=www
yyy=seeyou
aa=/aaa/${xxx}/bbb/${yyy}/ccc
说明:第一行4为输入总行数,其余为输入字符串,
输出:
/aaa/lyf/www/test/bbb/seeyou/ccc
说明:将最后一行等号右边的实际值输出
题目记录不是很详细,大致是这个意思,有遇到这个题的,可以直接拷贝我下边的java代码,亲测已通过。
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
/**
* 4
* xxx=lyf/${ttt}/test
* ttt=www
* yyy=seeyou
* aa=/aaa/${xxx}/bbb/${yyy}/ccc
*
* @param args
*/
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
//用来记录输入变量分割后的数值
Map<String, String> map = new HashMap<String, String>();
String val = "";
while (in.hasNextLine()) {
String s = in.nextLine();
if(s.isEmpty()){
break;
}
int lineNum = Integer.parseInt(s);
String temp = "";
for (int i = 0; i < lineNum; i++) {
String str = in.next();
String[] split = str.split("=");
map.put(split[0], split[1]);
if (i + 1 == lineNum) {
temp = str;
}
}
String[] lastLineArr = temp.split("=");
String[] strings = lastLineArr[1].split("/");
//替换成实际值后的字符串
val = getString(map, strings, val);
//循环处理字符串,直到所有变量被替换成实际值为止
while (val.contains("$")) {
String[] strs = val.split("/");
val = "";
val = getString(map, strs, val);
}
}
System.out.println(val);
}
private static String getString(Map<String, String> map, String[] strings, String val) {
for (int i = 0; i < strings.length; i++) {
if (strings[i].contains("$")) {
String key = strings[i].substring(2, strings[i].length() - 1);
String value = map.get(key);
if (i == 0) {
val = value;
} else {
val = val + "/" + value;
}
} else {
if (i == 0) {
val = strings[i];
} else {
val = val + "/" + strings[i];
}
}
}
return val;
}
}