Java算法题
算法学习札记
CSNZのBlog
深圳职业技术大学 19届软件技术专业
展开
-
和 LeetCode Battle (17、加一)
题目:加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外,这个整数不会以零开头。 思路:循环遍历数组判断值是否等于9,如果不等于9直接++即可,等于9则原位归零,继续判断上一位的值… 代码 public class PlusOne { public static int[] plusOne(int[] digits) { for(int i = digits.length-1原创 2021-08-25 14:17:20 · 72 阅读 · 0 评论 -
和 LeetCode Battle (16、最后一个单词的长度)
题目: 给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。 返回字符串中最后一个单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 思路:可以用切割字符串的api(split),我这边用的是将字符串转成字符数组,遍历每一个字符,两个变量,一个存结果字符串长度,一个作为中间判断子字符串是否已结束(遇到空格即归零) 代码: public static int lengthOfLastWord(String s) { int result = 0; int num原创 2021-08-25 09:48:22 · 98 阅读 · 0 评论 -
和 LeetCode Battle (15、最大子序和)
题目: 给定一个整数数组 nums 找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 示例 1: 输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。 思路: 遍历数组,依次求子序列总和,如果大于0则一直相加 每一次循环 判断一次 最大总和 与 子序列总和 的大小 最后返回最大总和 题解: public class MaxSubArray { public static int maxSu原创 2021-08-23 17:14:17 · 63 阅读 · 0 评论 -
和 LeetCode Battle (14、合并两个有序链表)
题目: 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 思路代码 public class ListNode { int val; ListNode next; ListNode() {} ListNode(int val) { this.val = val; } ListNode(int val, ListNode next) { this.val = val; this.next = next; } }原创 2021-08-22 23:52:07 · 68 阅读 · 0 评论 -
和 LeetCode Battle (13、找出奇数(常见面试题) )
题目一: 已知一个整型数组中 存在 唯一 的一个奇数次的数 其余的数 都是偶数次 现在要找出这个奇数次的数 考点:异或运算 public static void printOddTimesNum(int[] arrs) { int num = 0; for(int x:arrs) { num ^= x; } System.out.println("奇数是:"+num); } 题目二: 已知一个整型数组中 存在 两个 的奇数次的数 其余的数 都是偶数次 现在要找出这俩个奇数次的数 考原创 2021-07-08 17:46:51 · 142 阅读 · 0 评论 -
和 LeetCode Battle (12、排序数组 )
public static void selectSort(int[] arrs) { long startTime = System.nanoTime();//获取开始时间 //判断数组是否为空 或者只有一个元素 if(arrs.length <2 | arrs == null) { return ; } //循环数组 比较大小 这里i< length-1 下面的j才不会发生数组越界 而且外层循环只需遍历length-1次即可 for(int i = 0;原创 2021-07-08 16:12:09 · 68 阅读 · 0 评论 -
和 LeetCode Battle (11、多数元素 )
题目:169. 多数元素 (超级水王 算法面试题) 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 普通解法 HashMap 空间复杂度为 O(N) public static int majorityElementByHashMap(int[] nums) { if(nums.length == 0 | nums == null) { return -1; } //遍历原创 2021-07-07 22:43:02 · 71 阅读 · 1 评论 -
和 LeetCode Battle (10、搜索插入位置 )
题目:搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。 如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 你可以假设数组中无重复元素。 输入: [1,3,5,6], 5 输出: 2 我的思路 用LinkedHashMap而不用HashMap的 原因是 HashMap是无序集合,存储和取出的顺序可能不一样 而 LinkedHashMap的特点: 1:底层是哈希表+链表(保证了迭代的顺序) 2:有序集合,存储和取出元素的顺序是一致的 public static int s原创 2021-07-04 10:40:45 · 56 阅读 · 0 评论 -
和 LeetCode Battle (9、实现 strStr() 函数 )
实现 strStr() 函数。 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。 说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符 字符串比较 public static int str原创 2021-07-01 19:25:02 · 93 阅读 · 0 评论 -
和 LeetCode Battle (8、移除元素)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 我的思路 思路:遍历每一个元素 如果要删除的是这个元素则从这个元素开始 后面的元素整体往前(此时指针不移动,判断是否有连续要删除的元素) 如果不是则指针向后移动 public static int removeElement(int[] nums,i原创 2021-06-30 14:48:45 · 73 阅读 · 0 评论 -
和 LeetCode Battle (7、删除有序数组中的重复项)
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成 输入:nums = [1,1,2] 输出:2, nums = [1,2] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素 经典双指针解法 public static int removeDuplicates(int[]原创 2021-06-29 22:28:28 · 76 阅读 · 0 评论 -
和 LeetCode Battle (6、有效的括号)
题目:20、有效的括号 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合 解题: 这里有三种不匹配的情况, 第一种情况,字符串里左方向的括号多余了 ,所以不匹配。{ { } 第二种情况,括号没有多余,但是 括号的类型没有匹配上。 { ] 第三种情况,字符串里右方向的括号多余了,所以不匹配 { } } 第一种情况:已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有原创 2021-06-28 10:41:59 · 72 阅读 · 0 评论 -
和 LeetCode Battle (5、寻找最长公共前缀)
题目:14 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串 “” 输入:strs = [“flower”,“flow”,“flight”] 输出:“fl” public static String CommonPrefix(String[] strs) { //如果数组为空直接return if(strs.length==0) { return ""; } //直接将 数组中的第一个字符串作为公共前缀原创 2021-06-27 10:11:00 · 61 阅读 · 0 评论 -
和 LeetCode Battle (4、罗马数字转整数)
题目:13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ,即为两个并列的 1。 12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX原创 2021-06-26 16:35:13 · 63 阅读 · 0 评论 -
和 LeetCode Battle (3、回文数)
题目: 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而 123 不是。 public class PalindromicNumber { //使用了StringBuffer public static boolean isPalindrome(int x) { StringBuffer str1 = new StringBuffer(String.valueOf(x)原创 2021-06-26 08:36:54 · 79 阅读 · 0 评论 -
和 LeetCode Battle (2、整数反转)
题目 : 整数反转 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−2的31次方, 2的31次方 − 1] ,就返回 0。 假设环境不允许存储 64 位整数(有符号或无符号) 思路: 我一开始觉得直接用arrayList存 然后在从arrlyList数组中取 一开始卡在 八进制转换上了…就老想着如何解决 0123 变成 3210 因为0123是八进制数他对应的十进制数为83 所以一开始 程序一直打印38…一度怀疑是Java原创 2021-06-24 10:29:43 · 67 阅读 · 0 评论 -
和 LeetCode Battle (1、两数之和)
题目:源自LeetCode 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现 输入:nums = [2,7,11,15], target = 9 输出:[0,1] 解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。 第一次想法:暴力枚举双循环 public class twoSum { pu原创 2021-06-23 21:26:39 · 76 阅读 · 0 评论