【Java基础总结】-算法题总结

JAVA算法编程题全集(50题及答案) Java算法编程题,一共50道,答案完整,可以检测Java的掌握情况 立即下载

常见数据结构和算法编程题

1.二叉树的深度

public class Solution {
    public int TreeDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;
    }
}

2.判断平衡二叉树

public class Solution {
    public boolean IsBalanced_Solution(TreeNode root) {
        if (root == null)
            return true;

        if (Math.abs(TreeDepth(root.left) - TreeDepth(root.right)) > 1)
            return false;

        return IsBalanced_Solution(root.left) && IsBalanced_Solution(root.right);

    }
    //计算二叉树的深度
    public int TreeDepth(TreeNode root) {
        if (root == null) {
            return 0;
        }
        return Math.max(TreeDepth(root.left), TreeDepth(root.right)) + 1;
    }
}

3.排序算法总结

排序类别排序名称 (时间复杂度,空间复杂度,排序是否稳定)
交换类排序冒泡排序 (n², 1, 是)
快速排序 (nlogn, logn, 否)
插入类排序直接插入排序 (n², 1, 是)
折半插入(二分排序) ( n²,1,是)
希尔排序 (nlogn, 1, 否)
选择类排序简单选择排序 (n², 1, 否)
堆排序 (nlogn, 1, 否)
归并排序归并排序 (nlogn, n, 是)
基类排序基类排序 (dn, n, 是)

+++++++++

交换类排序源码

/**
 * <冒泡排序>
 * 根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,
 * 凡扫描到违反本原则的轻气泡,就使其向上“漂浮”
 */
public static void Bubble(int[] a) {
    // System.out.println("******冒泡排序******");
    for (int i = 0; i < a.length - 1; i++) {
        boolean exchange = false;
        for (int j = a.length - 1; j > i; j--) {
            if (a[j - 1] > a[j]) {
                swap(a, j - 1, j);
                exchange = true;
            }
        }
        if (!exchange) {
            return;
        }
    }
}
---------------------------------
/**
 * <快速排序>
 * 选取一个基准值,然后使 左边队列的值≦基准值≦右边队列的值
 * 通过递归调用对左右子区间快速排序得到结果
 */
public static void QSort(int[] a, int low, int high) {
    int i, j, temp;
    if (low < high) {
        i = low;
        j = high;
        temp = a[i];
        while (i < j) {
            while (i < j && a[j] > temp)
                j--;
            if (i < j) {
                a[i] = a[j];
                i++;
            }
            while (i < j && a[i] < temp)
                i++;
            if (i < j) {
                a[j] = a[i];
                j--;
            }
        }
        a[i] = temp;
        QSort(a, low, i - 1);
        QSort(a, i + 1, high);
    }
}

++++++
插入类排序源码

/**
 * <直接插入排序>
 * 从第一个元素开始,该元素可以认为已经被排好序。
 * 取出下一个元素,在已经排序的元素序列中从后往前扫描
 * 如果已排序的元素大于新元素,则将该元素与后一位的新元素交换位置
 */
public static void InsertSort(int[] a) {
    int i, j;
    // System.out.println("******插入排序******");
    for (i = 1; i < a.length; i++) {
        for (j = i; j > 0 && a[j] < a[j - 1]; j--) {
            swap(a, j, j - 1);
        }
    }
}
------------------------
/**
 * <折半插入排序(二分排序)>
 * 在直接插入排序的基础上,取出下一个元素时,不是扫描插入,
 * 而是通过二分查找的方式确定新元素要插入已排序中的位置,
 * 再直接后移位置,插入新元素。
 */
public static void BinaryInsertSort(int[] a) {
    int i, j, low, high, m, temp;
    // System.out.println("******二分排序******");
    for (i = 1; i <= a.length; i++) {
        temp = a[i];
        low = 1;
        high = i - 1;
        while (low <= high) {
            m = (low + high) / 2;
            if (temp < a[m])
                high = m - 1;
            else
                low = m + 1;
        } // while
        for (j = i - 1; j > high; j--)
            a[j + 1] = a[j];
        a[high + 1] = temp;
    }
}// BinaryInsertSort
-------------------------
/**
 * 希尔排序
 */
public static int ShellSort(int[] a, int dlta[], int t) {
    int count = 0;
    for (int i = 0; i < t; i++) {
        count = ShellInsert(a, dlta[i]);
    }
    return count;
}

public static int ShellInsert(int[] a, int dk) {
    int i, j, count = 0;
    for (i = dk + 1; i < a.length; i++) {
        if (a[i] < a[i - dk])
            a[0] = a[i];
        for (j = i - dk; j > 0 && a[0] < a[j]; j -= dk) {
            a[j + dk] = a[j];
            count++;
        }
        a[j + dk] = a[0];
    }
    return count;
}

++++++
选择类排序源码

/**
 * <选择排序>
 * 首先在未排序序列中找到最小元素,存放到排序序列的起始位置,
 * 然后,再从剩余未排序元素中继续寻找最小元素,放到排序序列末尾。
 * 以此类推,直到所有的元素均排序完毕。
 */
public static void SelectSort(int[] a) {
    // System.out.println("******选择排序******");
    for (int i = 0; i < a.length; i++) {
        boolean exchange = false;
        for (int j = i + 1; j < a.length; j++) {
            if (a[i] > a[j]) {
                swap(a, i, j);
                exchange = true;
            }
        }
        if (!exchange) {
            return;
        }
    }
}

4.判断两个数组中是否存在相同的数字 问题

有一个 O(n)算法。因为两个数组都是排好序的。所以只要一次遍历就行了。首先设两个下标,分别初始化为两个数组的起始地址,依次向前推进。推进的规则是比较两个数组中的数字,小的那个数组的下标向前推进一步,直到任何一个数组的下标到达数组末尾时,如果这时还没碰到相同的数字,说明数组中没有相同的数字。

public class Solution {
    // 判断两个已排好序的数组是否有相同的元素
    public Boolean find(int[] a, int size1, int[] b, int size2){
        int i=0,j=0;
        while(i<size1&&j<size2){
            if(a[i]==b[j])
                return true;
            if(a[i]>b[j])
                j++;
            if(a[i]<b[j])
                i++;
        }
        return false;
    }   
}

5.最大子序列 问题

给定一整数序列A1, A2,… An (可能有负数),求A1~An的一个子序列Ai~Aj,使得Ai到Aj的和最大
这里运用动态规划的思想求解,可以使时间复杂度降为O(n)

public class Solution {
    // 利用动态规划 查找最大子序列和
    static int max_sub2(int[] a, int size) {
        int i, temp_sum = 0, max = 0;
        for (i = 0; i < size; i++) {
            temp_sum += a[i];
            if (temp_sum > max)
                max = temp_sum;
        }
        return max;
    }
}

6.按单词反转字符串/按字母反转单词

三种变换形态都将囊括

public class Solution {
    // java实现字母反转 "Hello This is my house"-->"olleH sihT si ym esuoh"
    public static String word_reverse(String str){
        String reverse_str = "";
        String[] array = null;
        array = str.split(" ");
        for (int i = 0; i < array.length; i++) {
            StringBuffer sb = new StringBuffer(array[i]);
            reverse_str +=sb.reverse().toString()+" ";
        }
        return reverse_str;
    }

    // java实现单词反转 "Hello This is my house"-->"house my is This Hello"
    public static String word_reverse2(String str){
        String reverse_str = "";
        String[] array = null;
        array = str.split(" ");
        for (int i = array.length-1; i >= 0; i--) {
            reverse_str +=array[i].toString()+" ";
        }
        return reverse_str;
    }

    //java实现单词+字母反转 "Hello This is my house"-->"esuoh ym si sihT olleH"
    public static String word_reverse3(String str){
        String reverse_str = "";
        String[] array = null;
        array = str.split(" ");
        for (int i = array.length-1; i >= 0; i--) {
            StringBuffer sb = new StringBuffer(array[i]);
            reverse_str +=sb.reverse().toString()+" ";
        }
        return reverse_str;
    }
}

7.删除数组中重复的数字

问题:一个动态长度可变的数字序列,以数字0为结束标志,要求将重复的数字用一个数字代替

public class Solution {
    // Java中利用ArrayList去除重复的元素
    public static List removeDuplicates(int[] a) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < a.length; i++) {
            if (!list.contains(a[i])) {
                list.add(a[i]);
            }
        }
        return list;
    }
}
因素空间与可拓学的互补性分析及问题处理融合模型 随着知识与信息数量的快速增长以及信息获取便利性的增加,企事业组织所面临的内外部环境更加复杂,业务问题呈现非线性、不确定性、多维化和实时交互性等特点。业务环境的高度不确定性和面临问题的开放性,人工智能与问题处理的深入研究迫切需要有一种自觉地为信息科学与智能科学服务的定性定量相结合的智能数学模型。经典数学适于描述物质世界的数量与空间关系,智能数学必须能描述信息拓展与智能机理。 阅读详情

相关推荐

用Python+ArcGIS分析厦门共享单车数据:5分钟搞定订单时长与距离分布的可视化

本文详细介绍了如何利用Python和ArcGIS Pro 3.x快速分析厦门共享单车数据,实现订单时长与距离分布的可视化。通过数据清洗、预处理和高级可视化技巧,揭示用户行为特征,为运营优化提供数据支持。文章还提供了环境配置、代码示例和业务洞察,帮助开发者高效完成数据分析任务。

weixin_28327051的博客 342

java经典算法题

1.Java多线程:写一下两个线程交替打印 0~100 的奇偶数 这种实现方式的原理就是线程1打印之后唤醒其他线程,然后让出锁,自己进入休眠状态。因为进入了休眠状态就不会与其他线程抢锁,此时只有线程2在获取锁,所以线程2必然会拿到锁。线程2以同样的逻辑执行,唤醒线程1并让出自己持有的锁,自己进入休眠状态。这样来来回回,持续执行直到任务完成。就达到了两个线程交替获取锁的效果了。 private int count = 0; private final Object lock = new Object()

ZHANGLIZENG的博客 8779

保姆级教程:用dnSpy调试Unity游戏,从找DLL到打断点全流程(附调试版mono.dll下载)

本文详细介绍了使用dnSpy调试Unity游戏的全流程,包括环境准备、关键程序集定位、mono.dll版本匹配与替换、调试环境配置及实战技巧。通过本教程,开发者可以高效进行Unity游戏逆向分析,适用于学习设计模式或安全审计等场景。

weixin_30236595的博客 578

JAVA 基础算法汇总(持续更新)

前言 做一些基础数据结构算法汇总,便于日后复习。 一、查找算法 1.顺序查找(线性查找) 依据数组的下标按顺序进行查找,然后返回数组下标。对于数据量较小的情况,比较适用。但是如果数据量较大,花费的时间就比较多。 2.二分查找 二分查找Binary Search 二分查找的使用,要有一个前提条件:要查找的数必须在一个有序数组里。在这个前提下,取中间位置数作为比较对象: 若要查找的值和中间数相等,则查找成功。 若小于中间数,则在中间位置的左半区继续查找。 若大于中间数,则在中间位置...

dayu199804的博客 1万+

傻瓜式下载、安装CentOS7操作步骤

CentOS7.9下载和安装操作步骤

weixin_45608163的博客 1万+

三维变换矩阵实战——三维点云的旋转、缩放、镜像、错切、平移、正交投影

旋转矩阵:右边矩阵是点云的原始坐标,左边的是旋转矩阵可视化:绕x轴旋转90度。

weixin_43850909的博客 8231

50道JAVA基础算法编程题【内含分析、程序答案】【建议收藏】【建议收藏】【建议收藏

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!大家看完有什么不懂的可以在下方留言讨论也可以关注。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!System.out.print(“请输入一个整数:”);//定义数组变量标识某人是否还在圈内i++)//定义圈内人数、报数、索引。

2401_84412988的博客 1850

将MathType、zotero嵌入Word、WPS

最近也是慢慢学起了写文稿之类的内容,在写论文的时候,肯定会遇到一些数学公式的插入,如果使用wps、word等自带的插入公式,一般不符合投稿期刊的格式要求,而且不方便、不美观,故开始研究MathType 这款插入公式的工具。

2401_83617940的博客 2279

编程题目联系

【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? 1.程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21.... 【程序2】 题目:判断101-200之间有多少个素数,并输出所有素数。 1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,...

qq_40890939的博客 786

彻底摆脱文献只能读开头的痛苦!这款文献检索神器真能帮你跨越文献付费限制(附实操演示)

大家是不是有过这样的经历,好不容易通过关键词搜到了和自己主题高度相关的文献,想要快速获取文献信息,推进研究进度,却又因为付费或者需订阅才能下载PDF,而被劝退。粘贴完成后,点击搜索,搜索结果页面会显示这篇文献的相关信息,有的文献有“下载PDF”,有的文献则只有“求助PDF”,不管是哪种情况,直接点击进入;我这里点击的是“下载PDF”,接着它会跳转页面。我用 Book 学术下载过不少付费文献,实测下来 80% 左右的文献,都能通过它的求助方式成功获取到,只有少部分文献等待的时间会稍微久一些或者没办法下载。

qq_64378896的博客 167

离散小波变换(概念与应用)

离散小波变换(概念与应用)

weixin_46713695的博客 4415

Java算法题必备知识

【代码】Java算法题必备知识。

lihao1875699404的博客 323

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java基础算法题

Java基础算法题 前言1、打印1000-2000年的闰年2、判断是否为素数3、打印1-100之间的素数4、水仙花数5、最大公约数6、最小公倍数7、年龄打印8、模拟密码登录总结 前言 本文章主要是一些初学者编程算法题,由Java进行编译。 1、打印1000-2000年的闰年 普通闰年:公历年份是4的倍数且不是100的倍数为普通闰年(如2004、2020年就是闰年)。 世纪闰年:公历年份是整百数的,必须是400的倍数才是世界闰年(如2000.

Lirene_的博客 4430

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java基础算法题

无论什么时候,面试官都看重程序员的算法基本功,这也是证明自己能力的最直接的方法,所以面试之前一定要多多温习算法,最近因为面试我简单总结了几个小算法,编译运行通过的,如果有什么错误,欢迎指正^V^ 1.求n的阶乘 方法一:使用递归算法 /** * 递归求阶乘 * @param n * @return */ public int fac1(int n){ ...

b509_ying的博客 709

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

java 兔子问题_java基础算法题,兔子问题和水仙花束

大家都知道java的知识点非常的多又很复杂,它的题目也涉及到方方面面,今天就来为大家展示java基础算法题,也就是兔子问题和水仙花束,一起来看看吧。一、TestRabbit.java题目是古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?先进行分析: 兔子的规律为数列1,1,2,3,5,8,13,21......

weixin_42519497的博客 324

Java基础算法题 — 字符串反转

字符串反转 Java的一个基础算法题:将字符串反转,也称作字符串逆序输出。 利用String的toCharry()将字符串转化成char类型数组 将字符串逆序拼接 public static String reverse(String str) { char[] chars = str.toCharArray(); String result = ""; for (int i = ...

guaishushulq的博客 393

java五道基础算法题

常见的算法题,难度从简单到困难,可以用来开拓下思维。javabean基础类。

峰会路转的博客 596

Java基础算法题(22):利用递归方法求5!。

查看所有50道基础算法题请看: Java的50道基础算法题 package Demo22Factorial; public class Factorial { /** * 利用递归方法求5!。 */ /* 分析,这个题目其实是上一道题目的一部分,求阶乘嘛F(n)=F(n-1)*n */ public static void main(...

凉拌糖醋鱼 1388

java的基础算法题

这里将会写几个学习java中遇到的题或在力扣上的经典算法题, 也算是记录java学习的历程了吧。

qq_45020131的博客 1926

Java 基础中的基础算法题

1.输入一个数字,判断其是否为水仙花数。 public static void main(String[] args) { //接受控制台输入信息 Scanner scanner = new Scanner(System.in); System.out.println("请输入一个数"); //获取控制台输入的数字 int number = scanner.nextInt(); //取的百位数

weixin_45087693的博客 4967

java的基础算法_java基础算法题

java基础算法题发布时间:2020-06-10 14:15:23来源:亿速云阅读:227作者:鸽子【程序1】题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?1.程序分析:可填在百位、十位、个位的数字都是1、2、3、4。组成所有的排列后再去 掉不满足条件的排列。public class Wanshu {public static void main(Strin...

weixin_33406123的博客 122

【算法题】别再为 Java 算法题犯难,码蹄杯上这些新手题库帮你打好基础

本文分享了码蹄杯编程竞赛中的基础题型解析,涵盖实型数运算、平均分计算、圆球相关计算、公式计算、字符型数据处理等多个方面。通过Java代码示例,详细讲解了如何实现这些基础编程任务,包括输入输出、数据类型转换、数学运算等核心知识点。文章旨在帮助编程初学者通过典型例题掌握从问题建模到代码实现的完整流程,为后续学习更复杂的编程任务打下坚实基础。

2301_80350265学无止尽5的博客 4966
上一篇: 【Java基础总结】-Java笔试易错点 第一篇
下一篇: 【Java基础总结】-类和对象的易错点
gamedev˚
博客等级 码龄12年 280粉丝 293原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值