关于整数的一些题目

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;
        }
    }
    
posted @ 2022-05-07 15:53  心是冰冰的  阅读(44)  评论(0)    收藏  举报