代码随想录算法训练营day01 | leetcode 704/27
2024-09-08 15:56:53
前言
考研结束半个月了,自己也简单休整了一波,估了一下分,应该能进复试,但还是感觉不够托底。不管怎样,要把代码能力和八股捡起来了,正好看到卡哥有这个算法训练营,遂果断参加,为机试和日后求职打下一个基础。
我之前断断续续地刷过一些LeetCode,但是不成体系,数量也少得可怜,才区区50+,在寻找暑期实习的过程中吃够了苦头,希望通过这次训练营得到一个长足的提升,养成自己写博客的习惯,慢慢提升自己的博客水准。
之前的LeetCode刷题分析
LeetCode
704 二分查找
二分是一个很基础的思维和技能,但是在动手敲代码时还是有些错误和值得完善的地方。我的初步思路是po出代码,卡壳&忽略等问题采用多行注释标注,(这也是我今后回顾的重点),并针对使用的数据结构和题目特征进行总结。
数据结构知识
本题主要采用了数组这一在内存连续存储的数据结构,这里对java中的数组和常用“工具”进行介绍。数组的删除需要移动元素,这一点要尤其注意。
//一维数组初始化
type[] arrayName = new type[size];
type[] arrayName = new type[]{值 1,值 2,值 3,值 4,• • •,值 n};
type[] arrayName = {值 1,值 2,值 3,...,值 n};
int[] number = {1,2,3,5,8};
//遍历一
for (int i=0;i<number.length;i++) {
System.out.println("第"+(i+1)+"个元素的值是:"+number[i]);
}
//遍历二
for(int val:number) {
System.out.print("元素的值依次是:"+val+"\t");
}
//二维数组初始化
type[][] arrayName = new type[size1][size2]; // 给定空间,在赋值
type[][] arrayName = new type[size][]; // 数组第二维长度为空,可变化
type[][] arrayName = new type[][]{{值 1,值 2,值 3,…,值 n},{值 1,值 2,值 3,…,值 n}}; // 在定义时初始化
double[][] nums = { { 100, 99, 99 }, { 100, 98, 97 }, { 100, 100, 99.5 }, { 99.5, 99, 98.5 } };
//遍历一
for (int i = 0; i < nums.length; i++) { // 遍历行
for (int j = 0; j < nums[i].length; j++) {
System.out.println("nums[" + i + "][" + j + "]=" + nums[i][j]);
}
}
//遍历二
for (double[] row : nums) {
for (double value : row) {
System.out.println(value);
}
}
/*
* 注意 在二维数组中,直接使用 length 属性获取的是数组的行数,
* 在指定的索引后加上 length(如 array[0].length)表示的是该行拥有多少个元素,即列数
*/
Arrays & Collections 工具类
int[] array;
int[][] twoDArray;
Arrays.toString(array);
// 数组到字符串
Arrays.asList(array);
// array到list
Arrays.sort(array);
// 升序排列数组
Arrays.sort(twoDArray,(v1,v2) -> v1[0] - v2[0]);
// v1 v2是每一行的元素 每一行升序排列
Arrays.binarySearch(array, 3);
// 二分查找
Arrays.fill(array, val);
// 填充数据
Arrays.copyOfRange(array,from,to);
// [from,to)
Arrays.copyOf(array, 8);
// 获取新数组 少补多截
Arrays.equals(array1,array2);
// @Return boolean
String[] in = new String[]{ "1", "a"};
List<String> out = new ArrayList<>(in.length);
// 创建列表,并指定长度,避免可能产生的扩容
Collections.addAll(out, in);
// 这样新建的集合out可以进行add等操作
Java语言有很多API可以使用,是好事也是坏事,平时多记多用,减轻笔试压力,拓宽做题思路。
Code
class Solution {
public int search(int[] nums, int target) {
/* 未优先考虑的
* 避免当 target 小于nums[0] nums[nums.length - 1]时多次循环运算
if (target < nums[0] || target > nums[nums.length - 1]) {
return -1;
}
*/
int left = 0, right = nums.length - 1;
while(left <= right){
int mid = (left+right)/2;
int val = nums[mid];
if(val == target){
return mid;
}else if(val < target){
left = mid+1;
}else{
right = mid-1;
}
}
return -1;
}
}
27 移除元素
code
这题没什么值得说的,基本的数组移动
class Solution {
public int removeElement(int[] nums, int val) {
int len = nums.length;
int ans = len;
for(int i = 0; i<len;){
if(nums[i] == val){
for(int j=i; j<len-1; j++){
nums[j] = nums[j+1];
}
len--;
ans--;
continue;
}else{
i++;
}
}
return ans;
}
}
总结:
写代码是件费脑子的事情,要是能找到银弹可就太好了,可目前还是只能一点一点去积累经验,形成自己的刷题模式,不断完善。下面是我总结的一些通用的刷题考虑方向,后续会不断完善,欢迎评论区各位码友分享自己的经验。
- 优先考虑特殊情况
- 动笔画图,推演执行过程
- 打日志
欢迎指正!
最新文章
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
- github的注册过程
- Struts2 + Spring + Hibernate 通用 Service 和 DAO
- Swift主题色顶级解决方案一
- android4.3环境搭建
- android网络开发之测试机连接到服务器上面
- #openstack故障处理汇总
- 为你揭秘知乎是如何搞AI的——窥大厂 | 数智方法论第1期
- android------个人项目(歆语气象通新版)
- arduino 引脚作为输入时的不稳定 解决方案
- Date相关
- 圆角矩形shader
- 包装类接受string 会自动将数字类型string转换成对应得包装类型
- asp gridview
- Uedit编辑器编辑Velocity
- HTTP协议之chunk介绍
- spring boot 访问项目时加项目名称
- java web中的多条件查询
- 零基础全面学习HTML
- 一个愚蠢的python逻辑语法错误
热门文章
- 【大数据工具选型】ETL&;同步&;调度工具比较-Kettle、Streamset,DataX、Sqoop、Canel,DolphinSchedule、Azkaban、Oozie、Airflow、Xxl Job
- 【Shell案例】【awk、grep、sort、uniq】10、第二列是否有重复
- 【企业流行新数仓】Day02:DWS层(按日分区的宽表)、DWT层(全量累计表)、ADS层、总结
- L1-050 倒数第N个字符串 (15分)
- python里面一些零碎知识点
- [编程基础] C++多线程入门6-事件处理的需求
- 推荐给Amy的书单
- mysql 1366 - Incorrect string value
- day06-Spring管理Bean-IOC-04
- 如何让Java编译器帮你写代码