算法小白成长之路(一)

简介: ---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};

   }

}


相关文章
|
1月前
|
算法 JavaScript 前端开发
探索编程之美:从小白到大牛的旅程
【10月更文挑战第9天】编程,这个听起来高深莫测的词汇,实际上就像是一场奇妙的探险。它不仅仅是冷冰冰的代码和算法,更是一扇打开新世界大门的钥匙。本文将带你领略编程的魅力所在,从最初的迷茫与困惑,到逐渐找到自己的方向,最终在技术的海洋里遨游。无论你是编程新手,还是希望进一步提升的开发者,都能在这段旅程中找到属于自己的光芒。
|
6天前
|
机器学习/深度学习 前端开发 算法
探索代码之美:从小白到专家的技术成长之路
【10月更文挑战第36天】技术之路,犹如攀登一座座高峰,每一步都充满挑战与惊喜。本文将带你走进编程世界,从基础语法到复杂算法,从简单项目到大型架构,一起感受代码的魅力和力量。无论你是初学者还是资深开发者,都能在这里找到共鸣和启发。让我们一起在代码的海洋中遨游,探索那些隐藏在每一行代码背后的智慧与哲理。
技术探索的心得与感悟
在这篇文章中,我们将深入探讨技术探索过程中的心得与感悟。通过分析个人经历、项目实践和技术发展的趋势,总结出有益的经验和启示,以期为读者提供一些参考和借鉴。本文将涵盖从基础学习到高级应用的多个方面,分享一些实用的技巧和方法,帮助你更好地理解和应用技术,实现个人成长和发展。
|
4月前
|
数据采集 前端开发 JavaScript
探索技术之路:我的编程之旅与感悟
在数字化时代的浪潮中,编程已成为连接思想与现实的桥梁。本文通过个人经历的叙述,探讨了编程学习过程中的困难与挑战、解决问题的策略以及持续学习的重要性。文章旨在为那些初入编程世界的朋友们提供一些实用的建议和鼓励,同时分享作者对于技术发展的深刻见解。
37 0
|
1月前
|
Python
探索代码之美:从小白到专家的技术成长之旅
编程,这个曾经让我望而却步的神秘领域,如今已成为我生活的一部分。它不仅仅是一种技能,更是一种艺术,一种解决问题的思维方式。从最初的迷茫与困惑,到现在的游刃有余,我经历了一个充满挑战与收获的学习过程。在这个过程中,我逐渐理解了编程的本质,掌握了编程语言的精髓,也学会了如何将理论知识应用于实际问题。这篇文章将分享我的技术感悟,带你一起走进编程的世界,探索代码背后的奥秘。
37 3
|
3月前
|
数据采集 JavaScript 前端开发
代码之旅:从小白到专家的蜕变之路
在数字时代的浪潮中,编程技能成为了一项宝贵的资产。本文将带领读者回顾我从一位对代码一无所知的新手,逐步成长为能够独立解决问题的专家级程序员的过程。通过分享我的学习经历、遇到的挑战以及克服困难的策略,旨在为同样渴望在编程世界中留下自己足迹的朋友们提供一份实用的指南和鼓励。
32 0
|
算法
人为什么要努力?编程、学习之路…很迷茫?个人经验分享
人为什么要努力?编程、学习之路…很迷茫?个人经验分享
|
前端开发 JavaScript 关系型数据库
阿里云感悟
就这一点我感觉阿里云服务器给我的体验感极佳。 在这里我由衷地感谢阿里云官方为我们这些初级开发者所提供的免费服务器体验,让我们体会到了作为一名开发者在拥有服务器后的满足感。并且让满足了我对于服务器使用的好奇心,同时也让我积累和学习到了很多的服务器使用经验。在后边的开发者生涯当中,我会一直使用阿里云服务器,一直做阿里云的忠实的粉丝,在往后的开发学习过程中,我会更加努力的学习技术和支持,我坚信,终有一天,我也可以为阿里云的发展贡献出自己的一份力量!
|
弹性计算 物联网
阿里云使用感悟
飞天加速计划·高校学生在家实践使用感悟
166 1
小白成长之路
我是一个从来没有学过网页开发的小白,通过在阿里云两周的学习,获得了很大的进步,希望可以不断成长,最后遇见更好的自己!
111 0