1. 程式人生 > >【一週程式設計學習】--1.用雜湊思想實現LeetCode的第1題和第202題

【一週程式設計學習】--1.用雜湊思想實現LeetCode的第1題和第202題

1.LeetCode第一題    兩數之和


以一個數為基準,再用目標數減去基準數得到他們的差值,再在陣列中找這個差值。這個時候以陣列存放的數值為key值,數值對應的陣列下標為value值。利用雜湊查詢演算法查詢相應值的下標。


分別用C++和Pyhton做的:

vector<int> twoSum(vector<int> nums,int target)
{
	unordered_map<int,int> hash;
	vector<int> res;
	for(int i=0;i<nums.size();i++){
		if(hash.find(target-nums[i])!=hash.end()){
			res.push_back(hash[target-nums[i]]);
			res.push_back(i);
			return res;
		}
		hash[nums[i]]=i;
	}

	return res;
}

 

class Solution:
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        hashTable={}
        for _index,value in enumerate(nums):
            if not value in hashTable:
                hashTable[value]=_index
            if target-value in hashTable:
                if _index!=hashTable[target-value]:
                    return [hashTable[target-value],_index]


2.LeetCode 第202題 Happy Number

題意說對於某一個正整數,如果對其各個位上的數字分別平方,然後再加起來得到一個新的數字,再進行同樣的操作,如果最終結果變成了1,則說明是快樂數,如果一直迴圈但不是1的話,就不是快樂數,那麼現在任意給我們一個正整數,讓我們判斷這個數是不是快樂數

考慮用set記錄所有出現過的數字,每次出現新的數字與set中的數字進行比較,查詢是否已經存在,如果存在則跳出迴圈,該數不是快樂數;否則將該數加入set中。


使用C++和Python:

class Solution {
public:
    bool isHappy(int n) {
    unordered_set<int> mySet;
	while(n!=1){
		int t=0;
		while(n){
			t+=(n%10)*(n%10);
			n/=10;
		}
		n=t;
		if(mySet.count(n)) break;
		else mySet.insert(n);
	}
	
	return n==1;
    }
};
class Solution:
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """
        visited=set()
        while n!=1:
            n=sum(int(i)**2 for i in str(n))
            if n in visited:
                return False
            else:
                visited.add(n)
        else:
            return True

3.陣列的學習

.陣列名可以看做常量指標使用

陣列名是陣列首元素的地址

陣列的地址和陣列首元素的地址是相同的,但意義不一樣。

a[n] <=>*(a+n) <==>*(n+a) <==> n[a]

指標可以當做陣列名使用

int a[5]={0};

int * p=a;

陣列作為函式引數時,編譯器編譯成指標,退化為指標

void func(int a[]) ==>void func(int *a) ==>void func(int*a,int a_size)


使用vector容器可以替代陣列 int array[]。

一維陣列的定義 vector<int> array;

vector<int> array(10,0); // 大小為10,初始值為0

新增陣列元素 array.push_back(1);

刪除陣列元素 array.erase(array.begin(),array.begin()+2); //刪除第 0 、1個元素

(a.begin(), a.end())則表示起始元素和最後一個元素之外的元素位置。

刪除最後一個數據 array.pop_back();

插入陣列元素 array.insert(array.end(),0); //在陣列尾部後插入資料0

array.insert(array.begin(),0); //在陣列第0個前插入資料0

陣列的元素個數 array.size();

array.end(); //end操作返回的迭代器指向vector的“末端元素的下一個”,表明指向一個不存在的元素

 

陣列元素從小到大排序

#include<algorithm>

sort(array.begin(),array.end());

陣列元素從大到小排序

reverse(array.begin(),array.end());