"不要因为别人的成功而感到沮丧,你的时机会来,只要你继续努力、坚持不懈。"
作者:不能再留遗憾了
专栏:Java学习
本文章主要内容:使用哈希表的思想解决旧键盘打字和两数字
leedcode之两数之和(难度:简单)
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 :
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
class Solution {
public int[] twoSum(int[] nums, int target) {
}
}
我们使用哈希表的key - value模型,将数组下标代表的数据作为key,数组下标作为value,在遍历数组的同时判断target - nums[i]的数据是否存在,如果存在就返回 i 以及target - i 数据所在数组的下标,如果不存在那么就将nums[i]作为key, i 作为value放入哈希表中
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i++) {
if (hashtable.containsKey(target - nums[i])) {
return new int[]{hashtable.get(target - nums[i]), i};
}
hashtable.put(nums[i], i);
}
return new int[2];
}
}
旧键盘打字
旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及坏掉的那些键,打出的结果文字会是怎样?
输入描述:
输入在2行中分别给出坏掉的那些键、以及应该输入的文字。其中对应英文字母的坏键以大写给出;每段文字是不超过10^5个字符的串。可用的字符包括字母[a-z, A-Z]、数字0-9、以及下划线“_”(代表空格)、“,”、“.”、“-”、“+”(代表上档键)。题目保证第2行输入的文字串非空。
注意:如果上档键坏掉了,那么大写的英文字母无法被打出。
输出描述:
在一行中输出能够被打出的结果文字。如果没有一个字符能被打出,则输出空行。
示例:
输入
7+IE.
7_This_is_a_test.
输出
_hs_s_a_tst
根据题目我们需要分析处当出现什么情况的时候会出现某个字母打不出来的时候.
1.如果该字母为小写字母并且当该键盘坏掉的时候
2.如果这个字母为大写的并且上档键坏掉了
当知道什么时候不打印某字母的时候,我们可以使用Set模型,Set来存放坏掉的键,第一次遍历坏掉的键,将这些坏掉的键放入Set中,并记录上档键是否坏掉.第二次遍历输入的字母,先判断是否为大写字母,如果为大写字母,那么只有当该字母键不是坏的并且上档键不是坏的时候才打印,否则就不打印,当为小写字母的时候那么就判断该字母键是否为坏的.
import java.util.Scanner;
import java.util.HashSet;
import java.util.Set;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void func(String str1,String str2) {
Set<Character> set1 = new HashSet<>();
//flag来记录上档键是否为坏的
Boolean flag = false;
//因为坏的键盘都是以大写字母打印出来的,所以我们将它转换为小写的
str1 = str1.toLowerCase();
for(int i = 0; i < str1.length(); i++) {
char ch = str1.charAt(i);
if(ch == '+') {
flag = true;
}
set1.add(ch);
}
for(int i = 0; i < str2.length(); i++) {
char ch = str2.charAt(i);
if(ch >= 'A' && ch <= 'Z') {
ch = Character.toLowerCase(ch);
if(!set1.contains(ch)) {
if(!flag) {
System.out.print(Character.toUpperCase(ch));
}
}
}else {
if(!set1.contains(ch)) {
System.out.print(ch);
}
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
while (in.hasNextLine()) { // 注意 while 处理多个 case
String str1 = in.nextLine();
String str2 = in.nextLine();
func(str1,str2);
}
}
}