力扣算法入门刷题

news2025/2/24 0:50:26

1、回文数

判断输入的整数是否是回文

我的一般思路:

将输入的整数转成字符串,再将这个字符串转成字符数组c,对字符数组进行遍历,如果第i个元素与第 c.length - i - 1 元素不相等,也就是通过比较首尾元素是否相同来判断是否是回文,只要有一个不相等就不是。

public boolean isPalindrome(int x) {
String s = String.valueOf(x);
char[] c = s.toCharArray();
        
for(int i=0;i<c.length;i++){
    //比较前后元素是否相同
   if(c[i]!=c[c.length-i-1]){
       return false;
    }
}
return true; 
}

进阶思路

先排除掉一定不为回文的数,比如最后一位是0且不为0,或者小于0的整数,再讨论可能为回文的情况,通过对整数除以十取余,对余数乘10,将原整数顺序颠倒,具体思路如下图

 public boolean isPalindrome(int x) {
        //先排除不为回文的数
        if(x < 0 || (x % 10 == 0&&x!=0)){
            return false;
        }      
        
        //处理的余数 初值为0
        int reverNum = 0;
        while(x>reverNum){
            reverNum = reverNum * 10 + x % 10;
            x /= 10;
        }
        
        //第二种情况是当存在131这种以中间对称的数时会变成 1 和 13,所以需要做除以十取整操作
        return(x == reverNum || x == reverNum / 10);
    }

2、最长公共前缀

求一个字符串数组的最长公共前缀

解题思路

既然是比较一个字符串数组中所有字符串的公共前缀,那么可以额外封装一个方法,用来返回两个字符串之间的公共前缀,让他们进行两两比较,最终得出所有字符串的公共前缀

public String longestCommonPrefix(String[] strs) {
        //先排除非0和为空的情况
        if(strs == null || strs.length == 0){
            return "";
        }
        
        //取第一个数作为初始值比较
        String prefix = strs[0];
        //取字符串数组的总长度作为循环执行次数
        int num = strs.length;
        //执行循环
        for(int i=1;i<num;i++){
            //调用比较两个字符串公共前缀的方法
            prefix = SelectMaxPro(prefix,strs[i]);
            if(prefix.length() == 0){
            //如果两个字符串的公共前缀为0说明没有公共前缀
            //一旦有两个字符串没有公共前缀则字符串数组也没有,就跳出for循环
            break;
        }
        
        if(prefix.length() == 0){
            return "";
        }
        
        
        }
        return prefix;
    }
    
    
    //创建查找两个字符最大公共前缀的方法
    public String SelectMaxPro(String str1,String str2){
    
    //创建一个变量作为索引,用来截取相同的前缀
    int index = 0;
    //找出两字符串之间最短的一个作为循环条件,防止数组越界
    int minLength = Math.min(str1.length(),str2.length());
    //index<minLength时 作为循环条件,并且当str1和str2对应index位置上的字符相同时index++再继续比较下一个
    while(index < minLength && str1.charAt(index) == str2.charAt(index)){
        index++;
    }


    return str1.substring(0,index);
    }

3、有效的括号

这里先引入栈的创建方式

栈是一种先入后出的数据结构(Last In First Out, LIFO)

栈的基本实现

public class StackDemo {
    public static void main(String[] args) {
        //使用链表创建栈
        LinkedList<Character> stack = new LinkedList<>();

        //向栈中添加元素
        //1、添加元素到栈顶
        stack.addFirst('d');
        //2、添加元素到栈底
        stack.addLast('v');
        //封装好的添加元素的方法
        stack.push('p');  //底层直接调用addFirst()
        

        //从栈中取数据
        //当栈中元素为空时使用这种方式进行取数据会抛出NoSuchElementException异常
        //1、取出栈顶元素并返回
        stack.removeFirst();
        //2、取出栈底元素并返回
        stack.removeLast();
        //3、封装好的方法返回栈顶元素
        stack.pop(); //它的底层就是调用了removeFirst()

        //查看栈中元素
        //1、查看第一个元素
        stack.getFirst();
        //2、查看最后一个元素
        stack.getLast();
        //封装好的方法返回栈顶元素
        stack.peek();
    }
}

题目

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    每个右括号都有一个对应的相同类型的左括号。

public class Solution{

//创建哈希表存储键值对
Map<Character,Character> map = new HashMap<Character,Character>{{
    //使用此方式在创建哈希表示就对元素进行初始化
    put('(',')');put('{','}');put('[',']');put('?','?');
}};

public static boolean isValid(string s){

        if(s.length() % 2 == 1){
            return false;
        }

        //创建栈
        //此处对栈初始化一个元素,防止在栈空情况下出栈抛异常
        LinkedList<Character> stack = new LinkedList<Character>{{push('?')}}
        char[] chars = s.toCharArray;
        for(char c : chars){
            if(map.containsKey(c))  stack.push(c);
            //在此处进行了一个出栈的操作 满足条件就会出栈
            else if(c != map.get(stack.pop())) return false;
        }
        return stack.size() == 1;

    }
}

此方法稍微有点难以理解的点在于他是何时进行的出栈,虽然他是进行一个判断栈顶元素是否等于当前元素,但当他执行完这个判断条件时就会将栈顶元素弹出,这里也可以这么理解:


//弹出的字符
char c = stack.pop()
//如果c等于弹出字符对应的值就继续向后判断否则false
if( c == map.get(c)){
    continue;
}else{
    return false;
}

只能用于理解实际这么写会报错

4、删除有序数组中的重复项并返回处理后的数组长度

解决本题采用双指针运算,定义一个快慢指针,将快指针小于数组长度作为循环条件,如果快指针与快指针后一个位置的值相同,就说明两个元素值不相同,就将快指针的值赋给慢指针,使得不重复数据提到数组靠前的位置。但要注意双指针的初始位置都在第二位元素上,因为如果快指针在第一个位置会造成数组越界,慢指针在第一位如果前两个元素不相同,就会覆盖第一个元素。

class Solution {
    public int removeDuplicates(int[] nums) {

        int length = nums.length;
        if(length == 0){
            return 0;
        }

        //定义快慢指针
        int fast = 1;
        int low = 1;
        while(fast < length){
            if(nums[fast] != nums[fast - 1]){
                nums[low] = nums[fast];
                low++;
            }
            fast++;
        }
        return low;
    }
}

5、移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

对于此题可以采用基础的增强for循环实现,如果数组中的数据不等于目标值就在将这个值重新赋值给数组,否则就跳过该数据,这种方式在某种意义上也是一个双指针,只不过是Java封装好的

class Solution {
    public int removeElement(int[] nums, int val) {
        int index = 0;
        for(int num : nums){
            if(num != val){
                //如果不相等就将原值重新放进数组并使指针后移
                nums[index++] = num;
            }
        }
        return index;
    }
}

当然也可以采用双指针的方式实现

class Solution {
    public int removeElement(int[] nums, int val) {
        //定义左指针
        int left = 0;
        //定义右指针
        int right = nums.length-1;

        while(left <= right){
            if(nums[left] == val){
                nums[left] = nums[right];
                right--;
            }else{
                left++;
            }
        }
        return left;
    }
}

6、搜索插入位置

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

本题采用二分查找算法,可以作为简单二分查找入门题

二分查找: 定义两个指针,一个指向数组第一个位置,另一个指向数组最后一个位置,通过计算两个位置中心位置的值与目标数据进行对比,如果小于目标值,就将中间位置赋给左指针,否则赋给右指针,最后的结果一定是两指针位置相等

class Solution {
    public int searchInsert(int[] nums, int target) {
        //定义左指针
        int left = 0;
        //定义右指针
        int right = nums.length;
        while(left <= right){
        //设置中间位置
        //这样处理的目的是防止(left+right)/2发生数组越界异常
        int mid = left + (right - left) / 2;
            if(nums[mid] < target){
                //这里使用加一的原因是数组为递增数组,中间值已经小于目标值
                //所以可以直接跳过mid值
                left = mid + 1;
            }else{
                right = mid - 1;
            }
        }
        return left;
    }
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2785.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自动化早已不是那个自动化了,谈一谈自动化测试现状和自我感受……

前言 从2017年6月开始接触自动化至今&#xff0c;已经有好几年了&#xff0c;从17年接触UI自动化&#xff08;unittestselenium&#xff09;到18年接触接口自动化&#xff08;unittestrequests&#xff09;再到18年自己编写自动化平台&#xff08;后台使用python的flask&#…

风、光、柴油机、蓄电池、电网交互微电网经济调度优化问题研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

爆破校园网的宽带

前提&#xff1a;学校的手机号前7位相同&#xff0c;宽带密码都是手机号后六位。仅供学习。 准备工作&#xff1a;电脑一台&#xff0c;把校园网的宽带水晶头插在电脑上&#xff0c; 步骤&#xff1a; winR输入Rasphone点击新建&#xff0c;宽带&#xff0c;输入宽带名称&am…

Vue复刻华为官网 (一)

1 分析 根据华为网页的布局&#xff0c;我们大体上可以将其划分为7个盒子&#xff0c;如下&#xff0c;由于写一个这样的网页再加上部分动态效果&#xff0c;需要的时间很长&#xff0c;本篇博客只记录了div1、div2、div3的静态效果轮播图的实现。 2 顶部盒子的实现 想要实现的…

【C++AVL树】4种旋转详讲

目录 引子&#xff1a;AVL树是因为什么出现的&#xff1f; 1.AVl树的的特性 2.AVl树的框架 3.AVL树的插入 3.1四种旋转&#xff08;左单旋、右单旋、左右双旋、右左双旋&#xff09; 3.1.1左单旋 3.1.2右单旋 3.1.3左右双旋 3.1.4右左双旋 总结 引子&#xff1a;AVL树是因…

【单片机】单片机的核心思想

&#x1f4ac;推荐一款模拟面试、刷题神器 、从基础到大厂面试题&#xff1a;&#x1f449;点击跳转刷题网站进行注册学习 目录 一、单片机的核心思想 二、单片机核心图 三、上拉电路及应用 排阻的优势 四、单片机的输入输出模式 1、接收外部电压信号 2、向外输出电压信…

0089 时间复杂度,冒泡排序

/* * 排序也称排序算法&#xff08;Sort Algorithm&#xff09; * 排序是将一组数据&#xff0c;依指定的顺序进行排列的过程。 * * 排序分类 * 1.内部排序&#xff1a;将需要处理的所有数据都加载到内存存储器中进行排序&#xff08;使用内存&#xff09; * 插…

彻底搞懂WeakMap和Map

一 、Map Map是一种叫做字典的数据结构&#xff0c;Map 对象保存不重复键值对&#xff0c;并且能够记住键的原始插入顺序 Map的属性和方法* 属性&#xff1a; size&#xff1a; 返回所包含的键值对长度* 操作方法&#xff1a;* set(key,val): 添加新键值对* get(key): 通过传…

Linux--信号signal、父子进程、SIGCHLD信号相关命令

目录 1.概念&#xff1a; 2.信号的存储位置&#xff1a; 3.常见的信号的值以及对应的功能说明&#xff1a; 4.信号的值在系统源码中的定义&#xff1a; 5.响应方式&#xff1a; 6.改变信号的相应方式&#xff1a; (1)设置信号的响应方式: (2)默认:SIG_DFL;忽略:SIG_IGN…

Android Studio 新版本 Logcat 的使用

前言 最近&#xff0c;Android Studio 自动更新了自带的 Logcat 工具&#xff0c;整体外观和使用方法变得和之前完全不同了。一开始我以为是自己按到什么不该按的按钮&#xff0c;把 Logcat 弄坏了&#xff0c;后来才知道是版本更新导致的。新版本的 Logcat 用命令来过滤信息&…

jmeter变量函数以及抓包用法

抓包 代理服务器&#xff1a; 自己启动一个代理服务器 本地&#xff0c;要使用代理服务器的ip和端口&#xff0c;使用自己启动的代理服务器 操作步骤 添加线程组测试计划 > 非测试元件 > http代理服务器一定要修改 修改为** 测试计划>线程 ip就是你自己电脑的ip&…

Activity

Activity生命周期图 官网的 Activity 的生命周期图&#xff1a; 在官方文档中给出了说明&#xff0c;不允许在 onPause() 方法中执行耗时操作&#xff0c;因为这会影响到新 Activity 的启动。 常见情况下Activity生命周期的回调 &#xff08;A 与 B 表示不同的 Activity &a…

(硬件设计)老工程师的经验之道

系列文章目录 1.元件基础 2.电路设计 3.PCB设计 4.元件焊接 5.板子调试 6.程序设计 7.算法学习 8.编写exe 9.检测标准 10.项目举例 11.职业规划 文章目录前言1、用蜡烛油固定电位器2、电路板接插件用彩色接插件前言 送给大学毕业后找不到奋斗方向的你&#xff08;每周不定时…

Python----科学计数法、同时给多个变量赋值、eval函数、math库函数、复数(complex())、内置的数值运算函数、内置的数值运算操作符

科学计数法使用字母"e"或者“E”作为幂的符号&#xff0c;以10为基数&#xff0c;科学计数法的含义如下&#xff1a; 96e4&#xff1a;96乘10的4次幂 4.3e-3&#xff1a;4.3乘10的负三次幂 aeb&#xff1a;a*10*b 同时给多个变量赋值格式: 变量1&#xff0c;变量2表…

基于Python的电影推荐系统

电影推荐系统 目录 电影推荐系统 1 数据描述 1变量说明 1程序介绍 2 本次课程作业在 small-movielens 数据集的基础上&#xff0c;对用户、电影、评分数据进行了处理&#xff0c;然后根据 Pearson 相关系数计算出用户与其他用户之间的相似度&#xff0c;根据相似度进行推荐和…

用Python来表白,把情书写进她的照片里

前言 这不已经十一月了&#xff0c;22年马上就过完了&#xff0c;各位兄弟有对象了吗&#xff0c;现在就是缺钱还缺对象 退一步来说&#xff0c;有心仪的人吗啊&#xff0c;如果有的话&#xff0c;看看这篇 程序员的表白小妙招吧 实现步骤 想要实现把情书写在像素中&#xf…

【Web-HTML基础】颜色赋值、背景图片、文本和字体相关样式、元素的显示方式display、盒子模型、部分标签自带外边距或内边距

目录 颜色赋值 背景图片 文本和字体相关样式 元素的显示方式display 盒子模型 盒子模型之content内容 盒子模型之margin外边距 盒子模型之border边框 盒子模型之padding内边距 部分标签自带外边距或内边距 综合代码实现 颜色赋值 三原色: 红绿蓝 RGB RedGreenBlue …

【2022秋招面经】——深度学习

文章目录请写出常用的损失函数&#xff0c;平方损失、交叉熵损失、softmax损失函数和hinge1. 0-1 损失函数2. 绝对值损失函数3. 平方损失函数4. log 对数损失函数5. 指数损失函数&#xff08;exponential loss&#xff09;6. Hinge 损失函数7. 感知损失(preceptron loss)函数8.…

网课查题接口系统使用教程

网课查题接口系统使用教程 本平台优点&#xff1a;免费查题接口搭建 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a;题库后台http://daili.jueguangzhe.cn/…

使用微服务实现多设备自动调度

在实现app自动化过程中&#xff0c;有时候我们需要将多个手机中的任务&#xff0c;按照某种规则进行调度&#xff0c;这时仅仅使用移动端的脚本就无法完成了&#xff0c;需要配合使用微服务来完成。下面就举个例子来实际说明如何使用。 需求 假设我们有100台手机做任务&#…