小强在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成) 的箱子,并给出箱子编号,箱子编号为 1~N 。 每个箱子中都有一个 字符串s ,字符串由大写字母、小写字母、数字、标点符号、空格组成,需要在这些字符串中找到所有的字母,忽略大小写后排列出对应的密码串,并返回匹配密码的箱子序号。提示:满足条件的箱子不超过1个。第一行为 key 的字符串, 第二行为箱子 boxes,为数组样式,以空格分隔,箱子 N 数量满足 1 ≤ N ≤ 10000,s 长度满足 0 ≤ s.length ≤ 50,密码为仅包含小写字母的升序字符串,且不存在重复字母,密码 K 长度1 ≤ K.l e n g t h ≤ 26;返回对应箱子编号, 如不存在符合要求的密码箱,则返回 -1。java输出不同方法
时间: 2024-03-09 17:50:02 浏览: 111
以下是Java语言的不同方法实现:
方法一:暴力枚举
思路:遍历所有箱子,将每一个箱子中的字符串中的所有字母提取出来,排序后与给定的密码比较,若相同则返回箱子编号,否则继续遍历下一个箱子。
代码实现:
```
public static int findBox(String key, String[] boxes) {
char[] password = key.toCharArray();
Arrays.sort(password);//给定密码排序
for(int i = 0; i < boxes.length; i++) {
String box = boxes[i];
char[] letters = box.replaceAll("[^a-zA-Z]", "").toLowerCase().toCharArray();//提取箱子字符串中的字母并转为小写字母数组
Arrays.sort(letters);//排序
if(Arrays.equals(password, letters)) {//比较密码和箱子字符串中的字母排序后是否相同
return i + 1;//返回箱子编号
}
}
return -1;//未找到符合要求的箱子
}
```
方法二:哈希表
思路:将给定的密码中的字母及其出现次数存入哈希表中,遍历每个箱子中的字符串,统计其中每个字母出现的次数,最后比较两个哈希表是否相同,若相同则返回箱子编号,否则继续遍历下一个箱子。
代码实现:
```
public static int findBox(String key, String[] boxes) {
Map<Character, Integer> passwordMap = new HashMap<>();
for(char c : key.toCharArray()) {//将给定密码中的字母及其出现次数存入哈希表中
passwordMap.put(c, passwordMap.getOrDefault(c, 0) + 1);
}
for(int i = 0; i < boxes.length; i++) {
String box = boxes[i];
Map<Character, Integer> letterMap = new HashMap<>();
for(char c : box.toCharArray()) {
if(Character.isLetter(c)) {
char lc = Character.toLowerCase(c);
letterMap.put(lc, letterMap.getOrDefault(lc, 0) + 1);//统计箱子字符串中的字母出现次数
}
}
if(passwordMap.equals(letterMap)) {//比较两个哈希表是否相同
return i + 1;//返回箱子编号
}
}
return -1;//未找到符合要求的箱子
}
```
方法三:位运算
思路:将给定的密码中的字母转化为二进制数,每个二进制数的第i位表示第i个字母是否出现,遍历每个箱子中的字符串,统计其中每个字母出现的次数,将其转化为二进制数与给定密码的二进制数进行比较,若相同则返回箱子编号,否则继续遍历下一个箱子。
代码实现:
```
public static int findBox(String key, String[] boxes) {
int password = 0;
for(char c : key.toCharArray()) {//将给定密码中的字母转化为二进制数
int pos = c - 'a';
password |= (1 << pos);
}
for(int i = 0; i < boxes.length; i++) {
String box = boxes[i];
int letters = 0;
for(char c : box.toCharArray()) {
if(Character.isLetter(c)) {
int pos = Character.toLowerCase(c) - 'a';
letters |= (1 << pos);//统计箱子字符串中的字母出现次数
}
}
if(password == letters) {//比较两个二进制数是否相同
return i + 1;//返回箱子编号
}
}
return -1;//未找到符合要求的箱子
}
```
阅读全文