ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

关于整数的一些题目

2022-05-07 16:01:12  阅读:130  来源: 互联网

标签:字符 right 题目 words int 整数 关于 数组 字符串


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;
        }
    }
    

标签:字符,right,题目,words,int,整数,关于,数组,字符串
来源: https://www.cnblogs.com/AN-KATG/p/16242844.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有