关于整数的一些题目
1、排序数组中两个数字之和
-
描述
给定一个已按照 升序排列 的整数数组
numbers,请你从数组中找出两个数满足相加之和等于目标数target。函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足
0 <= answer[0] < answer[1] < numbers.length。假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。 -
解法
使用双指针就好了,由于数组是排好序的,如果 right 指向的数据 + left 指向的数据大于 target 的话,right 指向的是最大的数据,只能让它 -- 才可能匹配的到,如果小于的话,就让 left ++ 指向更大的数据来做匹配。 -
源码
class Solution { public int[] twoSum(int[] numbers, int target) { int left = 0; int right = numbers.length-1; while(left<right){ if(numbers[left]+numbers[right] == target) break; else if(numbers[left]+numbers[right] < target) left++; else if(numbers[left]+numbers[right] > target) right--; } return new int[]{left,right}; } }
2、只出现一次的数字
-
描述
给你一个整数数组
nums,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 -
解法
计算出所有数据每一位的和,再
%3就是那个只出现一次的数据的值了。由于是二进制的,这位只会是1或者0 -
源码
class Solution { public int singleNumber(int[] nums) { int res = 0; for(int i=0; i<32; i++){ int total = 0; for(int num: nums){ //这里一定要 & 1,&1 是取最低位的值,没有& 的话就是所有位置了。4>>1=2 (4>>1)&1=0 total += (num>>i)&1; } if(total%3 !=0){ //将第 i 位置为1 res |= (1<<i); } } return res; } }
3、单词长度的最大乘积
-
描述
给定一个字符串数组
words,请计算当两个字符串words[i] 和 words[j]不包含相同字符时,它们长度的乘积的最大值。假设字符串中只包含英语的小写字母。如果没有不包含相同字符的一对字符串,返回 0。 -
解法
显然我们需要遍历每一对字符串,判断他们是否含有相同的字符。这里给出一个判断是否含有相同字符的方法:将一个字符串出现的字母存储在一个整数中,将出现的字符的位置记录为 1 ,比较两个字串是否含有相同字符时只需要 将两个数据 相与 若等于0 ,就说明没有相同的字符。
-
源码
class Solution { public int maxProduct(String[] words) { int len = words.length; int[] marks = new int[len]; //对于每一个字符串记录下它里面的出现过的字符 for(int i=0; i<len; i++){ int length = words[i].length(); for(int j=0; j<length; j++){ //这里是 |= 哦 , 将1左移 //将出现的字符的位置记录为 1 marks[i] |= 1<<(words[i].charAt(j)-'a'); } } int max=0; //两两对比判断是否含有相同字符 for(int i=0; i<words.length-1; i++){ for(int j=i+1; j<words.length; j++){ if((marks[i] & marks[j]) == 0){ int add = words[i].length()*words[j].length(); max = Math.max(add,max); } } } return max; } }

浙公网安备 33010602011771号