算法小白成长之路(一)

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

   }

}


相关文章
|
2月前
|
机器学习/深度学习 前端开发 算法
探索代码之美:从小白到专家的技术成长之路
【10月更文挑战第36天】技术之路,犹如攀登一座座高峰,每一步都充满挑战与惊喜。本文将带你走进编程世界,从基础语法到复杂算法,从简单项目到大型架构,一起感受代码的魅力和力量。无论你是初学者还是资深开发者,都能在这里找到共鸣和启发。让我们一起在代码的海洋中遨游,探索那些隐藏在每一行代码背后的智慧与哲理。
|
3月前
|
Python
探索代码之美:从小白到专家的技术成长之旅
编程,这个曾经让我望而却步的神秘领域,如今已成为我生活的一部分。它不仅仅是一种技能,更是一种艺术,一种解决问题的思维方式。从最初的迷茫与困惑,到现在的游刃有余,我经历了一个充满挑战与收获的学习过程。在这个过程中,我逐渐理解了编程的本质,掌握了编程语言的精髓,也学会了如何将理论知识应用于实际问题。这篇文章将分享我的技术感悟,带你一起走进编程的世界,探索代码背后的奥秘。
46 3
|
5月前
|
数据采集 小程序 数据挖掘
探索代码之美:从初学者到专家的技术成长之旅
编程,一门将创意与逻辑结合的艺术,其学习过程充满了挑战与发现。本文通过个人经历,探讨了如何从一个对代码一无所知的初学者成长为一个能够熟练解决问题的专家。文章不仅分享了学习编程的实用技巧和策略,还讨论了在技术成长过程中保持动力和持续学习的重要性。
41 1
|
5月前
|
机器学习/深度学习 人工智能 算法
技术成长之路:从新手到专家的心路历程
【8月更文挑战第9天】在技术的世界里,每个人都是从零开始。本文将通过个人经历,探讨如何在技术的海洋中不断学习和成长,最终成为领域内的专家。我们将一起回顾那些挑战与成就,以及它们如何塑造了一个技术人员的职业轨迹。
|
5月前
|
数据采集 JavaScript 前端开发
代码之旅:从小白到专家的蜕变之路
在数字时代的浪潮中,编程技能成为了一项宝贵的资产。本文将带领读者回顾我从一位对代码一无所知的新手,逐步成长为能够独立解决问题的专家级程序员的过程。通过分享我的学习经历、遇到的挑战以及克服困难的策略,旨在为同样渴望在编程世界中留下自己足迹的朋友们提供一份实用的指南和鼓励。
44 0
|
5月前
|
程序员 开发者
技术成长之旅:从新手到专家的蜕变之路
【8月更文挑战第8天】在技术的海洋中,每一位程序员都曾是一名初学者。本文将通过个人经历和行业观察,探讨如何从技术新手成长为领域专家的过程。我们将深入讨论持续学习、实践、反思、交流与创新的重要性,并分享一些实用的成长策略。无论你是刚刚起步的技术爱好者,还是正在追求更高成就的资深开发者,这篇文章都将为你提供宝贵的启示和指导。
|
6月前
|
算法 程序员 开发者
探索代码之美:从新手到专家的技术成长之旅
【7月更文挑战第12天】编程,一个充满逻辑与创造的奇妙世界。本文将带你走进程序员的内心世界,感受从初学者到资深开发者的成长历程。我们将一同探讨编程基础的重要性,学习如何通过实践和反思来提升技能,以及如何在技术日新月异的环境中保持持续学习和适应的能力。你将发现,编程不仅仅是一门技术,更是一种艺术,一种生活方式。
|
8月前
|
存储 安全 编译器
c++的学习之路:3、入门(2)
c++的学习之路:3、入门(2)
36 0
|
8月前
|
存储 Linux C语言
c++的学习之路:2、入门(1)
c++的学习之路:2、入门(1)
58 0
|
8月前
|
C语言 C++
c++的学习之路:4、入门(3)
c++的学习之路:4、入门(3)
48 0