Arrays.sort()
Arrays.toString()
StringBuffer.append()
++st[nums[i]]
String,charAt()
登录力扣,点击题单,选择剑指offer(第二版),开始我的刷题之旅了
算法,作为一个程序员应该十分能理解这两个字的含义(进入大厂必备技能),除非你没有一颗进大厂的心,一开始的我是这样的,但是后来因为一些缘故,我必须要提升自己的技能,这样才能遇到志同道合的人跟你一起并肩作战。如果你还没毕业建议你多了解算法,如果你毕业了那么朋友卷起来。
Day1,先来前边几道题
没做之前是这样的,因为我之前确实没刷过,然后进了国企,说实话国企的氛围真的很不错,没有职场上的尔虞我诈,但是这里提升真的很慢,如果你是一个卷人,那么你可以选择跳一跳了,国企里的生活,项目忙的时候是真的忙,闲的时候也是真的闲,我是那种不喜欢加班的人所以一到点我就会走了,这样就有更多时间做自己想做的事情了。在职场上还是需要能抗打一些的,如果你不抗打,那么就会偶尔遇到什么事情心情就会很低落,这就会让你在乐观的道路上越走越远,这是绝对不行的,因为爱笑的女孩子会很幸运哦(这部分送给程序媛们)
练前了解学习
刚开始练的时候还是建议先了解一下:
二叉树,数组,链表,队列,栈,哈希表的使用,HashMap,二分查找,递归,回溯,贪心,动态规划
这个就很不错:代码随想录
Day1:剑指 Offer 03. 数组中重复的数字
力扣链接:剑指 Offer 03. 数组中重复的数字
看到这道题然后我想到的就挺复杂的解法,后来看到帅地的解法,觉得这种简单的解法太适合我了,太久没有硬是编程了,然后提交了好几遍才通过
题目:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
题解:这一题最重要的是排序Arrays.sort(nums);排序后前后比较,要是相等就返回,他只需要输出一个重复数字
class Solution {
public int findRepeatNumber(int[] nums) {
Arrays.sort(nums);
for(int i=0;i<nums.length-1;i++){
if(nums[i]==nums[i+1]){return nums[i];}
}
return -1;
}
}
喜欢这个解法:
class Solution {
public int findRepeatNumber(int[] nums) {
int n = nums.length;
int[] st = new int[n + 1];
for(int i = 0; i < n; i++) {
if(++st[nums[i]] > 1) return nums[i];
}
return -1;
}
Day1:剑指 Offer 04. 二维数组中的查找
力扣链接:剑指 Offer 04. 二维数组中的查找
这题我还是喜欢自己的左右指针写法,看了其他的感觉太复杂了,双指针写法可以让思路更清晰。
题目:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
.
题解:使用二分法的思路,判断比较,比目标值大数值往右移,比目标值小数值往左移,一次只判断一位数。行数:matrix.length;列数:matrix【0】.length;循环需要注意一下,行小于行数-1,列需要大于0
class Solution {
public boolean findNumberIn2DArray(int[][] matrix, int target) {
if(matrix==null||matrix.length==0||matrix[0].length==0)return false;
int rows =matrix.length;
int left =matrix[0].length-1;
int right=0;
while(right<=rows-1 && left>=0){
if(matrix[right][left]==target){
return true;
}else if(matrix[right][left]<target){
right++;
}else{
left--;
}
}
return false;
}
}
Day1:剑指 Offer 05. 替换空格
力扣题目:剑指 Offer 05. 替换空格
这个就比较简单了,可以产生很多思路
题解:遍历字符串,生成一个StringBuffer 字符序列,判断若为空格将“%20”append进去,否则append原本的数值
class Solution {
public String replaceSpace(String s) {
StringBuffer sb = new StringBuffer();
for(int i=0;i<s.length();i++){
if(s.charAt(i)==' '){
sb.append("%20");
}else{
sb.append(s.charAt(i));
}
}
return sb.toString();
}
}
Day1:剑指 Offer 06. 从尾到头打印链表
力扣题目:剑指 Offer 06. 从尾到头打印链表
我不知道有没有人跟我一样觉得链表挺好用,但是看到链表又有一些慌的,可能是当时在学校的时候,老师把它神话了,以至于我现在看到它如此的慌张,有没有人跟我一样拿到这种题就想着遍历,结果看人家需要输出的是啥数组,存进去不就行了
题目:输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
题解:遍历一遍链表得到链表长度,创建数组,从数组最后一个值开始存放,将链表从第一个值开始放进去
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public int[] reversePrint(ListNode head) {
ListNode temp = head;
int len =0;
while(temp !=null){
len++;
temp = temp.next;
}
int[] nums = new int[len];
temp =head;
while(temp !=null){
nums[--len]=temp.val;
temp = temp.next;
}
return nums;
}
}
今天的剑指offer完成,常练真的有好处,脑子都变得灵活多了,逻辑思维能力都能变强