1.设计哈希表
设置哈希集合
class MyHashSet {
private Bucket[] bucketArray;
private int keyRange;
/** Initialize your data structure here. */
public MyHashSet() {
this.keyRange = 769;
this.bucketArray = new Bucket[this.keyRange];
for (int i = 0; i < this.keyRange; ++i)
this.bucketArray[i] = new Bucket();
}
protected int _hash(int key) {
return (key % this.keyRange);
}
public void add(int key) {
int bucketIndex = this._hash(key);
this.bucketArray[bucketIndex].insert(key);
}
public void remove(int key) {
int bucketIndex = this._hash(key);
this.bucketArray[bucketIndex].delete(key);
}
/** Returns true if this set contains the specified element */
public boolean contains(int key) {
int bucketIndex = this._hash(key);
return this.bucketArray[bucketIndex].exists(key);
}
}
class Bucket {
private LinkedList<Integer> container;
public Bucket() {
container = new LinkedList<Integer>();
}
public void insert(Integer key) {
int index = this.container.indexOf(key);
if (index == -1) {
this.container.addFirst(key);
}
}
public void delete(Integer key) {
this.container.remove(key);
}
public boolean exists(Integer key) {
int index = this.container.indexOf(key);
return (index != -1);
}
}
/**
* Your MyHashSet object will be instantiated and called as such:
* MyHashSet obj = new MyHashSet();
* obj.add(key);
* obj.remove(key);
* boolean param_3 = obj.contains(key);
*/
2.存在重复的元素
重复元素
public boolean containsDuplicate(int[] nums) {
Set<Integer> set = new HashSet<>(nums.length);
for (int x: nums) {
if (set.contains(x)) return true;
set.add(x);
}
return false;
}
3.只出现一次的元素
出现一次
class Solution {
public int singleNumber(int[] nums) {
Map<Integer, Integer> map = new HashMap<>();
for (Integer i : nums) {
Integer count = map.get(i);
count = count == null ? 1 : ++count;
map.put(i, count);
}
for (Integer i : map.keySet()) {
Integer count = map.get(i);
if (count == 1) {
return i;
}
}
return -1; // can't find it.
}
}
4.两个数组的交集
//思路:
public int[] intersection(int[] nums1, int[] nums2) {
int count[]= new int[];
int j = 0;
for(int i = 0;i < nums1.length; i++){
for(int j = 0; j < nums2.length;j++){
if(nums1[i] == nums2[j]){
count[j] =nums1[i];
j++;
}
}
}
return count[];
}
//解题:
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<Integer>();
Set<Integer> set2 = new HashSet<Integer>();
for (int num : nums1) {
set1.add(num);
}
for (int num : nums2) {
set2.add(num);
}
return getIntersection(set1, set2);
}
public int[] getIntersection(Set<Integer> set1, Set<Integer> set2) {
if (set1.size() > set2.size()) {
return getIntersection(set2, set1);
}
Set<Integer> intersectionSet = new HashSet<Integer>();
for (int num : set1) {
if (set2.contains(num)) {
intersectionSet.add(num);
}
}
int[] intersection = new int[intersectionSet.size()];
int index = 0;
for (int num : intersectionSet) {
intersection[index++] = num;
}
return intersection;
}
}
5.快乐数
快乐数
//思路
HashSet<Integer> set = new HashSet<Integer>();
int sum = 0;
while(n %10 != 0){
int i = n%10;
sum += i*i;
}
while(true){
set.add(sum);
if(set.contains(sum)){
return false;
}
if(sum ==1){
return true;
}
return false;
}
//思路二
public boolean isHappy(int n) {
HashSet<Integer> set = new HashSet<Integer>();
int sum = 0;
while(true){
set.add(n);
while(n > 0){
int i = n%10;
sum += i*i;
n=n%10;
}
if(set.contains(sum)){
return false;
}else
continue;
if(sum==1){
return true;
}else
continue;
sum = 0;
set.add(sum);
//return false;
//解题
class Solution {
private int getNext(int n) {
int totalSum = 0;
while (n > 0) {
int d = n % 10;
n = n / 10;
totalSum += d * d;
}
return totalSum;
}
public boolean isHappy(int n) {
Set<Integer> seen = new HashSet<>();
while (n != 1 && !seen.contains(n)) {
seen.add(n);
n = getNext(n);
}
return n == 1;
}
}
6.两数之和
public int[] twoSum(int[] nums, int target) {
int length = nums.length;
int[] data = new int[2];
for(int i=0; i < length; i++){
for(int j= length-1; j >i; j--){
if(nums[i] + nums[j] == target){
return data[] i,j;
break;
}
}
}
return -1;
//解题
class Solution {
public int[] twoSum(int[] nums, int target) {
int n = nums.length;
for (int i = 0; i < n; ++i) {
for (int j = i + 1; j < n; ++j) {
if (nums[i] + nums[j] == target) {
return new int[]{i, j};
}
}
}
return new int[0];
}
}
//哈希表
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[0];
}
}
7.同构字符串
同构字符串
public boolean isIsomorphic(String s, String t) {
return isIsomorphicHelper(s, t) && isIsomorphicHelper(t, s);
}
private boolean isIsomorphicHelper(String s, String t) {
int n = s.length();
HashMap<Character, Character> map = new HashMap<>();
for (int i = 0; i < n; i++) {
char c1 = s.charAt(i);
char c2 = t.charAt(i);
if (map.containsKey(c1)) {
if (map.get(c1) != c2) {
return false;
}
} else {
map.put(c1, c2);
}
}
return true;
}