242.有效的字母异位词
题意:
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
思路:
用哈希表解题,在字符串s中遍历,定义一个26个空间的数组,a为1,b:2,以此类推。若在s中出现a,那么在数组a所对应的下标中,这个位置的元素自加一。再遍历t,出现的字母在数组中所对应的位置自减一。两步都结束后,如果数组中的元素都是0,那么证明字母在两个字符串中出现的次数相同,所以是字母异位词,反之不是。
注意点:
不可以遍历s后,将出现的元素在数组中对应的位置设值为1,因为可能会出现重复的元素。
代码:
两个数组的交集:
题意:给定两个数组,找出数组中重复的元素。
注意点:
题中只是说找重复的元素,那么如果有两个2,都重复了,那么我们其实只需要找一个2就可以了,所以是有一个去重的操作。并且是在一个数组里面找另一个数组的相同元素,所以这道题很适合用哈希表,并且因为要进行去重操作,所以可以用unordered_set 数据结构,(并且如果题目中的数,也就是哈希值很大的话,是不适合用数组操作的,因为浪费了很大的空间。)
说明unordered_set :是一种数据结构,他不对里面的元素进行排序,并且可以进行去重操作,他可以无限制的装元素,不会浪费空间。
思路:
先新定义个unordered_set result,用来装结果的,将一个数组转变成unordered_set形式,进行第一次去重操作,然后遍历第二个数组,看看再第一个数组中能否找到第二个数组元素的值,如果能找到,就放进result中,一直到遍历结束。
代码:
快乐数:
题意:
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 True ;不是,则返回 False 。
思路:
平方和是有可能重复的,而一旦重复就证明了进入了死循环,那么这个数就一定不是快乐数。大致流程为,创建unordered_set,让每一次平方和得出来的数,放入创建的哈希表中,然后如果这次循环得出来的数能在前一次循环中找得到,那么一定不是快乐数,返回false,如果平方和为一,那么返回true。
代码:
注意点:
在每次循环后,一定要写n=sum,重新给n赋值,求出新的sum。
两数之和
思路:由于我们在一个数组里找两个元素,并且还要返回下标,并且哈希值可能会很大,所以我们这里用std:ordered_map比较方便,可以同时储存下标和里面的值。
大致流程:
先创建map,然后遍历数组,如果再map中有能与当前遍历的值相加等于target的元素,那么返回数组下表,如果没有的话,将当前遍历的元素和所以对应的下标放入map中。
如果都没有 则返回空。
代码: