【一周编程学习】--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());


猜你喜欢

转载自blog.csdn.net/wxq_1993/article/details/85716681