Leetcode数组题*3

Leetcode数组题*3

66.加一

题目描述

  • 给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
  • 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
  • 你可以假设除了整数 0 之外,这个整数不会以零开头。

示例:

输入: [1,2,3]
输出: [1,4]
解释: 输入数组表示数字 123。

链接:https://leetcode-cn.com/problems/plus-one

思路分析

参考题解大神的巧妙解法:Java数学解题
一个数用数组存储,那么加上1之后只有两种情况

  • 最后一位不是9,直接让数组的最后一位加1后返回该数组。
  • 最后一位是9的情况,需要在循环中判断,因为它的前面一位也可能是9,首先让9变为0,然后前一位加1。
  • 如果最高位为9,可以创建一个新的数组,长度比原数组长度大一,首位置0。
    /**
     * 将一个用表示数字的数组传入,加上1之后,返回新数组
     * @param digits  传入的数组
     * @return  返回加一之后的新数组
     */
    public static int[] plusOne(int[] digits){
        int len = digits.length;
        for(int i = len-1;i>=0;i--){
            digits[i]++;
            digits[i] = digits[i]%10;
            //末位不是9,直接返回
            if(digits[i]!=0) return digits;
        }
        //最高位为9的情况,创建一个比原数组长1的数组
        int[] newDigits = new int[len+1];
        //首位置1,其余初始化为0
        newDigits[0] = 1;
        return newDigits;
    }

88.合并两个有序数组

题目描述

  • 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n。
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

    输入:
    nums1 =[1,3,0],m =3
    nums2 =[2,5,6],n =3
    输出: [1,6]

链接:https://leetcode-cn.com/problems/merge-sorted-array

思路分析

参考题解:画解算法

  • 由于nums1有足够的空间撑下两个数组,可以从后向前处理排序加合并
  • 设置指向两个数组数字尾部的指针p1和p2,和一个指向刚好是合并数组的最后一位的指针p。
  • 从后向前比较两个数组中的值,将大的放入nums1的后面,依次向前填充。
  • 当nums1中没有数的时候,将nums2全部拷贝到nums1的前面。
    /**
     * 合并并排序到第一个数组
     *
     * @param nums1 传入的第一个数组
     * @param m     第一个数组的长度
     * @param nums2 传入的第二个数组
     * @param n     第二个数组的长度
     */
    public static void merge(int[] nums1,int m,int[] nums2,int n) {
        int p1 = m - 1;//指向nums1的有数字的最后一位
        int p2 = n - 1;//指向nums2的有数字的最后一位
        int p = m + n - 1;
        //从有数字的最后一位向前,一一对比,两者较大的数存到nums1的p位置,分别向前
        while (p1 >= 0 && p2 >= 0) {
            nums1[p--] = nums1[p1] > nums2[p2] ? nums1[p1--] : nums2[p2--];
        }
        //由于是存到nums1上的,所以保证最后p1无元素可指的时候,把nums2上的元素按顺序拷贝到nums1
        System.arraycopy(nums2,nums1,p2 + 1);
    }

167.两数之和Ⅱ-输入有序数组

题目描述

  • 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

  • 函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:

返回的下标值(index1 和 index2)不是从零开始的
你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。
示例:

输入: numbers = [2,7,11,15],target = 9
输出: [1,2]
解释: 2 与 7 之和等于目标数 9 。因此 index1 = 1,index2 = 2 。

链接:https://leetcode-cn.com/problems/two-sum-ii-input-array-is-sorted

思路分析

参考题解:双指针求解两数之和

  • 注意是已排序数组,可以利用这一点求解。
  • 双指针求解,一指针指向前,一指针指向后。
  • 如果两个指针对应的和刚好是target,返回两个指针对应索引+1。
  • 如果和大于target,就将大数指针向前移动。反之,小数指针向后移动。
    /**
     * 得到传入数组中两个元素和刚好是目标数字的位置,用数组返回
     * @param numbers   传入的目标数组
     * @param target    传入的目标数字
     * @return   返回两元素和为目标数字的对应位置
     */
    public static int[] twoSum(int[] numbers,int target){
        int i = 0;
        int j = numbers.length-1;
        if(numbers == null) return null;
        while(i<j){
            int sum = numbers[i]+numbers[j];
            if(sum==target) return new int[]{i+1,j+1};
            else if(sum>target){
                j--;
            }else{
                i++;
            }
        }
        return null;
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


输出自然数 1 到 n所有不重复的排列,即 n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
编写一个能够输出“`Hello,World!`”的程序,这个程序常常作为一个初学者接触一门新的编程语言所写的第一个程序,也经常用来测试开发、编译环境是否能够正常工作。&#xA;&#xA;提示:“`Hello,Worl
题目相关 【题目描述】 求10000以内n的阶乘。 【输入】 只有一行输入,整数n(0≤n≤10000)。 【输出】 一行,即n!的值。 【输入样例】 4 【输出样例】 24 分析 首先n的阶乘是从1
题目相关 原题链接:P5461 赦免战俘 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目背景 借助反作弊系统,一些在月赛有抄袭作弊行为的选手被抓出来了! 题目描述 现有 $2n
水仙花数 题目描述 输出所有的&amp;quot;水仙花数&amp;quot;.所谓&amp;quot;水仙花数&amp;quot;是指这样的一个三位数:其各位数字的立方和等于该数本身。例如:371是
题目描述 奖学金 某小学最近得到了一笔赞助,打算拿出其中一部分为学习成绩优秀的前5名学生发奖学金。期末,每个学生都有3门课的成绩:语文、数学、英语。先按总分从高到低排序,如果两个同学总分相同,再按语文
已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。
题目相关 题目描述 我们要求找出具有下列性质数的个数(包含输入的正整数 n)。 先输入一个正整数 n(n ≤1000),然后对此正整数按照如下方法进行处理: 不作任何处理; 在它的左边加上一个正整数,
题目相关 题目描述 排列与组合是常用的数学方法,其中组合就是从n个元素中抽出r个元素(不分顺序且 r ≤n),我们可以简单地将n个元素理解为自然数1,2,…,n从中任取r个数。 现要求你输出所有组合。
题目相关 题目描述 把 m个同样的苹果放在 n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法。(5,1,1 和 1,1,5 是同一种方法) 输入格式 第一行是测试数据的数目 t,以下每行
题目相关 【题目描述】 求两个不超过200位的非负整数的和。 【输入】 有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。 【输出】 一行,即相加后的结果。结果里不能有多余的前导0,即如
请你编一程序实现两种不同进制之间的数据转换。
题目相关 【题目描述】 求两个大的正整数相减的差。 【输入】 共2行,第1行是被减数a,第2行是减数b(a &amp;gt; b)。每个大整数不超过200位,不会有多余的前导零。 【输出】 一行,即所
题目描述 一个数如果恰好等于不包含它本身所有因子之和,这个数就称为&amp;quot;完数&amp;quot;。 例如,6的因子为1、2、3,而6=1ʲʳ,因此6是&amp;quot;完数&amp
题目相关 【题目描述】 任意给定一个正整数N(N≤100),计算2的n次方的值。 【输入】 输入一个正整数N。 【输出】 输出2的N次方的值。 【输入样例】 5 【输出样例】 32 分析 本题考察的是
题目相关 【题目描述】 输入三个整数,整数之间由一个空格分隔,整数是32位有符号整数。把第二个输入的整数输出。 【输入】 只有一行,共三个整数,整数之间由一个空格分隔。整数是32位有符号整数。 【输出
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母
[toc] 707.设计双向链表 链表简介 链表(LinkedList) 是一种线性表,但不是顺序表,因为它是通过节点直接的相互引用相互联系起来的。 由于不必按顺序存储, 链表在插入和删除的时候可以达
题目描述 784. 字母大小写全排列 给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。 示例: 输入:S = &amp;quot;a1
[toc] Leetcode动态规划【简单题】 动态规划 (Dynamic programming,简称DP),是一种把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划相较于递归,拥有更