一、初见LeetCode

大一时候学习C++,根据课程一直在PTA平台做题目,数据结构和算法的作业题目也是在PTA。后来发现牛客网学习资源也很丰富,孤陋寡闻,前几个月在知道LeetCode这个平台,跟牛客网可以并称“程序员的左膀右臂”๑乛◡乛๑。虽然认识了LeetCode,但是一直挤出时间过来练练题,仰慕一下各位大佬的AC。今天就试了几道题,发现风格与PTA有很大不同,还需要不断去熟悉,别具风格的打题也挺有意思,通过几个简单题目,发现自己知识盲区,希望能够学习到更多!下面记录一下几个题目的思路解法。

二、字符串中的单词数

题目:

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

示例:

  1.  
    输入: "Hello, my name is John"
  2.  
    输出: 5
  3.  
    解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。

题解:

class Solution {
public int countSegments(String s) {
int count=0;
s=s.trim();
if(s.equals(""))
count=0;
else
{ String[] word=s.trim().split("\\s+");
count=word.length;
}
return count;
}
}

开始直接想到Java的函数,对这道题可以简单处理,容易解决。不过期间有几个注意点,就是处理连续空格和边界情况。

后来尝试C++手写方法,效果更好:

思路:使用一个flag标识每个单词分界点,如果当前字符不是空格且它前一个为空格(即此处分隔单词边界),则计数新单词个数。

class Solution {
public:
int countSegments(string s) {
int flag=1,count=0;
for(int i=0;i<s.length();i++)
{
if(s[i]!=' '&&flag)
{
count++;
flag=0;
}
if(s[i]==' ')
flag=1;
}
return count;
}
};
/*
作者:lu-hai-pan-jiang
链接:https://leetcode-cn.com/problems/number-of-segments-in-a-string/solution/jian-dan-zhi-jie-si-lu-ji-bai-100-by-lu-hai-pan-ji/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/

三、最富有客户的资产总量

给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i​​​​​ 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量 。

客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。

示例 1:

输入:accounts = [[1,2,3],[3,2,1]]
输出:6
解释:
第 1 位客户的资产总量 = 1 + 2 + 3 = 6
第 2 位客户的资产总量 = 3 + 2 + 1 = 6
两位客户都是最富有的,资产总量都是 6 ,所以返回 6 。

示例 2:

输入:accounts = [[1,5],[7,3],[3,5]]
输出:10
解释:
第 1 位客户的资产总量 = 6
第 2 位客户的资产总量 = 10 
第 3 位客户的资产总量 = 8
第 2 位客户是最富有的,资产总量是 10

示例 3:

输入:accounts = [[2,8,7],[7,1,3],[1,9,5]]
输出:17

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/richest-customer-wealth
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

Hint:

m == accounts.length
n == accounts[i].length
1 <= m, n <= 50
1 <= accounts[i][j] <= 100

这题目是签到题,思路直接简单。

class Solution {
public int maximumWealth(int[][] accounts) {
int maxV=0;
for(int i=0;i<accounts.length;i++)
{
int sum=0;
for(int j=0;j<accounts[i].length;j++)
sum+=accounts[i][j];
if(maxV<sum)
maxV=sum;
}
return maxV; }
}

四、三角形的最大周长

给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的、面积不为零的三角形的最大周长。

如果不能形成任何面积不为零的三角形,返回 0。

示例 1:

输入:[2,1,2]
输出:5

示例 2:

输入:[1,2,1]
输出:0

示例 3:

输入:[3,2,3,4]
输出:10

示例 4:

输入:[3,6,2,3]
输出:8

提示:

3 <= A.length <= 10000
1 <= A[i] <= 10^6

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/largest-perimeter-triangle
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:先将边长降序排列,从后往前扫描,贪心的思想,取得能够组成三角形的最大周长。

C++版本:

class Solution {
public:
int largestPerimeter(vector<int>& A) {
sort(A.begin(),A.end());
for(int i=A.size()-1;i>=2;i--)
{
if(A[i-2]+A[i-1]>A[i])
return A[i-2]+A[i-1]+A[i];
}
return 0;
}
};

Java版本:运行用时更短,奇怪了(・。・)

class Solution {
public int largestPerimeter(int[] A) {
Arrays.sort(A);
for(int i=A.length-1;i>=2;i--)
{
if(A[i-2]+A[i-1]>A[i])
return A[i-2]+A[i-1]+A[i];
}
return 0;
}
}

五、找出最具竞争力的子序列(中等难度)

给你一个整数数组 nums 和一个正整数 k ,返回长度为 k 且最具 竞争力 的 nums 子序列。数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。

在子序列 a 和子序列 b 第一个不相同的位置上,如果 a 中的数字小于 b 中对应的数字,那么我们称子序列 a 比子序列 b(相同长度下)更具 竞争力 。 例如,[1,3,4] 比 [1,3,5] 更具竞争力,在第一个不相同的位置,也就是最后一个位置上, 4 小于 5 。

示例 1:

输入:nums = [3,5,2,6], k = 2
输出:[2,6]
解释:在所有可能的子序列集合 {[3,5], [3,2], [3,6], [5,2], [5,6], [2,6]} 中,[2,6] 最具竞争力。

示例 2:

输入:nums = [2,4,3,3,5,4,9,6], k = 4
输出:[2,3,3,4]

提示:

1 <= nums.length <= 105
0 <= nums[i] <= 109
1 <= k <= nums.length

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-most-competitive-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

前面几道属于简单类型,这道中等题目就显得有些分量了,题目需要琢磨一会才知道是要干啥,就题做题。

看到一个大佬的解题思路,这个比较好理解:传送门

维护一个单调栈,从左到右遍历数组。

1、如果当前元素比队尾元素小,接下来判断剩余数组长度(len - i)和目标栈还需要元素个数(k - stack.size() + 1)大小。
     1.1 如果前者小于或等于后者,则说明不能再出栈了,否则剩余数组全加进栈也不够将栈填到k+1长度。(需要k+1而不是k是因为一开始就填进了-1,但这个-1是不会被返回的)
     1.2 如果前者大于后者,就将队尾元素出栈,并重复第一步

2、如果栈长度不够,不用判断,直接将当前元素进栈即可。

class Solution {
public int[] mostCompetitive(int[] nums, int k) { Stack<Integer> stack = new Stack<>();
stack.add(-1);
int len = nums.length; for (int i = 0; i < len; i++) {
//当前元素比队尾元素小,将队尾元素出栈
//此处需要另外判断数组剩余长度够不够填满栈,不然最后答案长度可能会小于k
while (nums[i] < stack.peek() && k - stack.size() + 1 < len - i) {
stack.pop();
}
if (stack.size() < k + 1) {
stack.add(nums[i]);
}
} int[] ret = new int[k]; while (k > 0) {
ret[--k] = stack.pop();
} return ret;
}
} //作者链接:https://leetcode-cn.com/problems/find-the-most-competitive-subsequence/solution/java-dan-diao-zhan-by-thedesalizes/

另外一个图文讲解,辅助理解:传送门

六、总结

今天一番解题经历下来,很明显遇到了最后这道题目就卡住了,说明还不够熟悉这方面的知识,存在许多盲区。程序语言是一个方面,关键在于数据结构和算法设计上,思路还不够清晰。所以就此发现了知识的缺漏,之后需要多练习,这么好的平台要利用好๑乛◡乛๑,向大佬们学习,提高一下编程能力。

C++/Java小白解Leetcode题,发现了知识盲区……的更多相关文章

  1. Bit Operation妙解算法题

    5道巧妙位操作的算法题. ***第一道*** 题目描述 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 说明: 你的算法应该具有线性时间复杂度. ...

  2. 基于java开发的在线题库系统tamguo

    简介 探果网(简称tamguo)是基于java开发的在线题库系统,包括 在线访问 后台运营 会员中心 书籍中心 管理员账号:system 密码:123456 因为线上数据和测试数据没有做到隔离,作者已 ...

  3. JAVA经典算法40题及解答

    JAVA经典算法40题 [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...

  4. JAVA经典算法40题

    1: JAVA经典算法40题 2: [程序1] 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 3 ...

  5. JAVA经典算法40题(原题+分析)之分析

    JAVA经典算法40题(下) [程序1]   有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?   1.程序分析:  ...

  6. Java小白如何一步步学好Java,听听企业Java培训师的实践经验吧

    今天我准备给小主展示一篇Java培训老师的文章,希望能给Java小白一个学好Java的路径或者提示.以下就是原文: 从大学到现在,我使用Java已经将近20年,日常也带实习生,还在公司内部做train ...

  7. JAVA经典算法50题(转)

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/51097928 JAVA经典算法50题 [程序1]   题目:古典问题:有一对兔子, ...

  8. Java 详解 JVM 工作原理和流程

    Java 详解 JVM 工作原理和流程 作为一名Java使用者,掌握JVM的体系结构也是必须的.说起Java,人们首先想到的是Java编程语言,然而事实上,Java是一种技术,它由四方面组成:Java ...

  9. JAVA经典算法40题面向过程

    JAVA经典算法40题 [程序1]   题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分 ...

随机推荐

  1. Django项目登录注册系统

    Django项目之个人网站 关注公众号"轻松学编程"了解更多. Github地址:https://github.com/liangdongchang/MyWeb.git 感兴趣的可 ...

  2. 【持续更新】Tomcat低级错误

    0(模板) 所犯错误: 现象: 报错内容: 1 所犯错误: 声明@Webservlet中未加"/"符号: 现象: 能够Connected to server,但是代码报错,且无法顺 ...

  3. Spring Cloud Alibaba 基础

    Spring Cloud Alibaba 基础 什么是Spring Cloud Alibaba 这里我们不讲解Spring Cloud 和 Spring Cloud Alibaba 的关系,大家自己查 ...

  4. phpstorm XDebug 调试

    最近要实现php功能,要提供个接口提供访问,但是我就是个菜鸡,网上找了一堆,所以来提供踩坑心得了 参考文档: https://blog.csdn.net/yinhangbbbbb/article/de ...

  5. leetcode75:search-a-2d-matrix

    题目描述 请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征: 每一行的数字都从左到右排序 每一行的第一个数字都比上一行最后一个数字大 例如: 对于下面的矩阵: [ [1, 3, ...

  6. leetcode131:letter-combinations-of-a-phone-number

    题目描述 给出一个仅包含数字的字符串,给出所有可能的字母组合. 数字到字母的映射方式如下:(就像电话上数字和字母的映射一样) Input:Digit string "23"Outp ...

  7. 25个Android酷炫开源UI框架

    1.Side-Menu.Android 分类侧滑菜单,Yalantis 出品.项目地址:https://github.com/Yalantis/Side-Menu.Android2.Context-M ...

  8. iOS 导航栏 工具条

    导航栏最常见的例子就是返回按钮的所在 在AppDelegate.m中,代码布局最开始定义窗口的时候, _window.rootViewController就应该为一个UINavigationContr ...

  9. 内网渗透 day4-meterpreter基本命令

    meterpreter基本命令 目录 1.getuid 查看当前用户 1 2.getpid 查看当前的进程id 1 3.getsystem 初步提权 1 4.ps 1.查看进程列表2.帮助我们获取pi ...

  10. JavaScript兼容性总结一点点

    JavaScript 不同浏览器之间的差异还是很大,所以js库才这么有需求,需要解决各种兼容性问题. 其实反过来,既然存在js库能解决这些兼容性问题,说明底层大部分功能还是相通的. 首先想到的是事件模 ...