查找第一个非重复的字符,无得话返回-1,做的时候返回了字符数组的编号,太着急了,枯了。。。。。。。
@Test public void searchfeichong(){ // 查找第一个非重复的字符,无得话返回-1 String str = "dawdhkadh"; char[] sc = str.toCharArray(); HashMap<Character,Integer> map = new HashMap<>(); for (int i = 0; i < sc.length; i++) { if (map.containsKey(sc[i])){ map.put(sc[i],map.get(sc[i]) + 1); }else { map.put(sc[i],1); } } for (int i = 0; i < sc.length; i++) { if (map.get(sc[i]) == 1){ System.out.println("非重复的第一个字符为:" + sc[i]); return; } } System.out.println(-1); }
最开始的时候出的题目
给定一个无重复元素的数组candidates和一个目标函数target,找出candidates中所有可以使得数字和为target的组合。
现在想想,不难,解法如下:
快速排序,在一个有序的数组(从小到大)中最左边一定是最小值,最右边是最大值。我们可将最小值与最大值相加与目标值进行比较,如果两数之和大于目标值,我们就让最大值小一点(读取第二个最大值),如果两数之和小于目标值,我们就让最小值大一点(读取第二个最小值),如果两数之和刚好等于目标值,保存最大值,最小值,并且让最大值小一点,最小值大一点。需要注意的是前提条件是数组必须有序!!!
简化:对nums先排序,然后定义两个指针,一个low = 0指向数组头,一个high = len(nums) - 1指向数组的尾,看其和nums[low]+nums[high]是否== target;若==,则查找成功返回;若>sum,则尾指针high--;若<sum,则头指针low++。
时间复杂度:快排O(NlogN),查找O(N);所以总的时间复杂度为:O(NlogN)。
# 快速排序思想 def getRes_QuickSort(nums, target): nums = sorted(nums) len1 = len(nums) res = [] if len1>= 2: low, high = 0, len1-1 while low < high: if nums[low] + nums[high] == target: res.append((nums[low], nums[high])) low += 1 high -= 1 elif nums[low] + nums[high] > target: high -= 1 else: low += 1 return res
使用哈希表的思维去解:
给定一个数,根据hash表查找另一个数只需要O(1)的时间。但需要空间换时间,空间复杂度为O(n);可以用hashMap实现,hashMap<a[i], 次数>。遍历一遍数组,若次数没有存在hashMap中,则将其加入,次数为1;再遍历一遍数组,对每个值nums[i],判断target - nums[i]是否在hashmap中【即对应的value是否==1】;若存在,则查找成功;否则继续遍历下一个。直到遍历完整个数组。
# 哈希表思想 def getRes_HashMap(nums, target): result = [] for i, value in enumerate(nums): if (target - value) in nums[i+1:]: result.append((value, target - value)) return result