算法小白成长之路(一)

简介: ---title: 算法小白成长之路(一)date: 2022-11-06 20:56:58tags: -java-算法-力扣categories:-算法刷题总结---情景一:头尾交换位置往中间靠近:反转字符串:344. 反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。示例 1:输入:s = ["h","e","l","l","o"]输出:["o","l","l","e","h"]示例 2:输入:s = [

---

title: 算法小白成长之路(一)

date: 2022-11-06 20:56:58

tags:  

-java

-算法

-力扣

categories:

-算法刷题总结

---



情景一:

头尾交换位置往中间靠近:

反转字符串:

344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]

输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]

输出:["h","a","n","n","a","H"]

分析:

这道题就是典型的把一个字符左右位置交换顺序,使用双指针不需要重新创建一个字符,原地修改了该字符,直到两个指针相遇就得到了反转的字符.

class Solution {

   public void reverseString(char[] s) {

       int l = 0;

       int r = s.length - 1;

       //方法一:使用位于运算

       while (l < r) {

           s[l] ^= s[r];  //构造 a ^ b 的结果,并放在 a 中

           s[r] ^= s[l];  //将 a ^ b 这一结果再 ^ b ,存入b中,此时 b = a, a = a ^ b

           s[l] ^= s[r];  //a ^ b 的结果再 ^ a ,存入 a 中,此时 b = a, a = b 完成交换

           l++;

           r--;

       }

    //方法二:建立一个中间临时变量来进行赋值

       // for(int i=0;i<r/2;i++){

       //     l--;

       //     char temp=s[i];

       //     s[i]=s[l];

       //     s[l]=temp;


       // }

   }

}



561. 数组拆分

给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。返回该 最大总和 。

示例 1:

输入:nums = [1,4,3,2]
输出:4
解释:所有可能的分法(忽略元素顺序)为:

  1. (1, 4), (2, 3) -> min(1, 4) + min(2, 3) = 1 + 2 = 3
  2. (1, 3), (2, 4) -> min(1, 3) + min(2, 4) = 1 + 2 = 3
  3. (1, 2), (3, 4) -> min(1, 2) + min(3, 4) = 1 + 3 = 4
    所以最大总和为

示例 2:

输入:nums = [6,2,6,5,1,2]
输出:9
解释:最优的分法为 (2, 1), (2, 5), (6, 6). min(2, 1) + min(2, 5) + min(6, 6) = 1 + 2 + 6 = 9

分析:

仔细分析这道题发现原理上是很简单的一道题,甚至可以不用双指针,要求两两一组,取两数较小值相加获得的数最大,就可以想到实际本质就是排序之后获得下标为奇数的数所有数的和就是要求的解.

class Solution {

   public int arrayPairSum(int[] nums) {

       Arrays.sort(nums);

       int sum=0;

       for(int i=0;i<nums.length;i=i+2){

           sum+=nums[i];

       }

       return sum;

   }

}




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

给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列  ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。

示例 1:

输入:numbers = [2,7,11,15], target = 9

输出:[1,2]

解释:2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

示例 2:

输入:numbers = [2,3,4], target = 6

输出:[1,3]

解释:2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。

示例 3:

输入:numbers = [-1,0], target = -1

输出:[1,2]

解释:-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。

分析:

初始时两个指针分别指向第一个元素位置和最后一个元素的位置。每次计算两个指针指向的两个元素之和,并和目标值比较。如果两个元素之和等于目标值,则发现了唯一解。如果两个元素之和小于目标值,则将左侧指针右移一位。如果两个元素之和大于目标值,则将右侧指针左移一位。移动指针之后,重复上述操作,直到找到答案。

class Solution {

   public int[] twoSum(int[] numbers, int target) {

       for (int i = 0; i < numbers.length; ++i) {

           int low = i + 1, high = numbers.length - 1;

           while (low <= high) {

               int mid = (high - low) / 2 + low;

               if (numbers[mid] == target - numbers[i]) {

                   return new int[]{i + 1, mid + 1};

               } else if (numbers[mid] > target - numbers[i]) {

                   high = mid - 1;

               } else {

                   low = mid + 1;

               }

           }

       }

       return new int[]{-1, -1};

   }

}


相关文章
|
7月前
|
机器学习/深度学习 人工智能 算法
人工智能面试题86问,新手找工作必备!
人工智能面试题86问,新手找工作必备!
91 0
|
8月前
|
算法 安全 程序员
程序员成长之路有哪些绝对不能踩的坑?
程序员成长之路有哪些绝对不能踩的坑?
22 0
|
9月前
|
数据采集 算法 Go
我的半年算法学习成长之路~
我的半年算法学习成长之路~
|
11月前
|
算法
人为什么要努力?编程、学习之路…很迷茫?个人经验分享
人为什么要努力?编程、学习之路…很迷茫?个人经验分享
|
机器学习/深度学习 设计模式 运维
如何快速成长为技术大牛
不管是开发测试运维,每个技术人员心里多多少少都有一个称为技术大牛的梦,毕竟梦想总是要有的,万一实现了呢?正是对技术梦的追求促使我们不断地努力和提升自己,然而梦想是美好地现实却是残酷的,很多同学在实际工作后就会发现,很想称为技术大牛但做的事情看起来跟大牛都不沾边,比如程序员说:“天天写业务代码还加班,如何才能成为技术大牛”。测试说每天都有执行不完的测试用例。运维说:“扛机器 接网线 敲shell命令, 这不是我想要的运维人生”。
如何快速成长为技术大牛
|
弹性计算 安全 Cloud Native
技术小白的成长体验
通过阿里云,让我这个不懂技术的小白,变成了一个初级技术开发师
|
前端开发 JavaScript 关系型数据库
阿里云感悟
就这一点我感觉阿里云服务器给我的体验感极佳。 在这里我由衷地感谢阿里云官方为我们这些初级开发者所提供的免费服务器体验,让我们体会到了作为一名开发者在拥有服务器后的满足感。并且让满足了我对于服务器使用的好奇心,同时也让我积累和学习到了很多的服务器使用经验。在后边的开发者生涯当中,我会一直使用阿里云服务器,一直做阿里云的忠实的粉丝,在往后的开发学习过程中,我会更加努力的学习技术和支持,我坚信,终有一天,我也可以为阿里云的发展贡献出自己的一份力量!
|
弹性计算 物联网
阿里云使用感悟
飞天加速计划·高校学生在家实践使用感悟
145 1
小白成长之路
我是一个从来没有学过网页开发的小白,通过在阿里云两周的学习,获得了很大的进步,希望可以不断成长,最后遇见更好的自己!
92 0
|
数据可视化 Ubuntu Linux
使用阿里云的感悟
大家对 windows 都相对熟悉,可视化界面确实方便——但是相对于指令而言,在管理服务器方面太弱了。 尽管windows服务器是一个可选项,但是仍然强烈推荐初学者学习一下linux 指令,使用指令管理服务器更加方便而且 “看起来厉害”。inux 下的绝大多数指令是差不多的,但是也有一些差异,需要根据个人习惯选择。但是不能使用可视化界面,服务器是用来用的,不是用来看的。当学会几行指令后,服务器就非常听话了。如果最近在看一个相关的视频教程,了解老师使用的是什么操作系统,最好和老师保持一致。以避免更多的麻烦。 特别值得强调的是,最新的不一定是最好的;朋友喜欢的不一定是自己习惯的。 个人推荐使用 C