首页 Java Java面试题 java面试中常见的数组题目汇总(二)

java面试中常见的数组题目汇总(二)

Nov 09, 2020 pm 03:27 PM
java 数组 面试

java面试中常见的数组题目汇总(二)

1、斐波那契数列

【题目】

大家都知道斐波那契数列,现在要求输入一个整数 n,请你输出斐波那契数列的第 n 项(从 0 开始,第 0 项为 0)。

(视频教程推荐:java课程

【代码】

package swear2offer.array;


public class FeiBoNaQi {

    /**
     * 大家都知道斐波那契数列,现在要求输入一个整数 n,
     * 请你输出斐波那契数列的第 n 项(从 0 开始,第 0 项为 0)。
     * 0,1,1,2,3,5
     * n<=39
     * */
    public int Fibonacci(int n) {
        if (n == 0) return 0;

        if (n == 1 || n== 2) return 1;

        return Fibonacci(n-1) + Fibonacci(n-2);
    }

    /**
     * 非递归方式,递归的数据结构使用的栈,那就是使用栈的方式
     * */
    public int NoRecursive(int n) {
        if (n>2) {
            int[] a = new int[n+1];
            a[0] = 0;
            a[1] = 1;
            a[2] = 1;

            for (int i=3; i<=n; i++) {
                a[i] = a[i-1] + a[i-2];
            }

            return a[n];
        } else {
            if (n == 0) return 0;
            else return 1;
        }
    }

    public static void main(String[] args) {
        System.out.println(new FeiBoNaQi().Fibonacci(39));
        System.out.println(new FeiBoNaQi().Fibonacci(39));
    }
}

2、矩形覆盖

【题目】

我们可以用 21 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 21 的小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种方法?

比如 n=3 时,2*3 的矩形块有 3 种覆盖方法:

12711bde10f197c3e9af47c34b0cc46.png

代码:

package swear2offer.array;

public class Rectangle {

    /**
     * f[0] = 0;
     * f[1] = 1;
     * f[2] = 2;
     * f[3] = 3;
     * f[4] = 5;
     * f[5] = 8;
     * f[n] = f[n-1] + f[n-2]
     * */

    public int RectCover(int target) {

        if (target < 4) return target;

        int[] f = new int[target + 1];
        int i;
        for (i=0; i<4; i++) f[i] = i;

        for (i=4; i<=target; i++) {
            f[i] = f[i-1] + f[i-2];
        }

        return f[target];
    }



    public static void main(String[] args) {
        System.out.println(new Rectangle().RectCover(5));
    }
}

【思考】

最直白的结题方式就是找规律,从总结的规律可以看出这是斐波那契数列的实现方式;另一种就是根据题意来解答,求n的方法,这类问题很容易想到是从n-1来求解,而第一个块是横(f[n-2])是竖(f[n-1]),分别对应不同的情况

(更多相关面试题推荐:java面试题及答案

3、二进制中 1 的个数

【题目】

输入一个整数,输出该数二进制表示中 1 的个数。其中负数用补码表示。

【代码】

package swear2offer.array;

public class Binary {

    /**
     * 输入一个整数,输出该数二进制表示中 1 的个数。其中负数用补码表示。
     * */
    public int NumberOf1(int n) {
        int count;
        count = 0;

        while(n != 0) {
            n = n & (n-1);// 与操作就是二进制的操作,适用原码和补码
            count ++;
        }

        return count;
    }
}

【思考】

负数的反码: 符号位不变,其余各位按位取反负数的补码:在其反码的基础上+1

如果一个整数不为 0,那么这个整数至少有一位是 1。如果我们把这个整数减 1,那么原来处在整数最右边的 1 就会变为 0,原来在 1 后面的所有的 0 都会变成 1 (如果最右边的 1 后面还有 0 的话)。其余所有位将不会受到影响。

举个例子:一个二进制数 1100,从右边数起第三位是处于最右边的一个 1。减去 1 后,第三位变成 0,它后面的两位 0 变成了 1,而前面的 1 保持不变,因此得到的结果是 1011. 我们发现减 1 的结果是把最右边的一个 1 开始的所有位都取反了。这个时候如果我们再把原来的整数和减去 1 之后的结果做与运算,从原来整数最右边一个 1 那一位开始所有位都会变成 0。如 1100&1011=1000. 也就是说,把一个整数减去 1,再和原整数做与运算,会把该整数最右边一个 1 变成 0. 那么一个整数的二进制有多少个 1,就可以进行多少次这样的操作。

4、数值的整数次方

【题目】

给定一个 double 类型的浮点数 base 和 int 类型的整数 exponent。求 base 的 exponent 次方。
保证 base 和 exponent 不同时为 0

【代码】

package swear2offer.array;

public class Power {

    public double Power(double base, int exponent) {

        if (base == 0) return 0;
        if (exponent == 0) return 1;

        int count;
        boolean flag;
        double temp;

        count = 1;
        temp = base;
        flag = true;// 标记正负

        if (exponent < 0){
            exponent = -exponent;
            flag = false;
        }

        while (count < exponent) {
            base *= temp;
            count ++;
        }

        if (flag) {
            return base;
        } else {
            return 1/base;
        }

    }

    public static void main(String[] args) {
        System.out.println(new Power().Power(2,-3));
    }

}

【思考】

本题难度并不大,算法也不是很复杂,但是边边角角很容易遗漏,

第一点就是exponent的正负,很容易就漏掉负数的情况

其次,base==0和exponent==0的情况是不一样的

最后,base累乘的时候,是不能用本身的,因为base是不断变大的。

5、调整数组顺序使奇数位于偶数前面

【题目】

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

【代码】

package swear2offer.array;

import java.util.Arrays;

public class OddEven {

    /**
     * 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,
     * 使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,
     * 并保证奇数和奇数,偶数和偶数之间的相对位置不变。
     *
     * 时空复杂度较高的算法:
     * 新建一个数组b,用来保存奇数,在重新变量一次,保存偶数
     * 时空复杂度0(n)
     * */
    public void reOrderArray1(int [] array) {
        int n,i,j;
        n = array.length;

        int[] b = new int[n];

        j = 0;// 用来保存数组B的下标
        for (i=0; i<n; i++) {
            if (array[i]%2 != 0) {
                b[j] = array[i];
                j ++;
            }
        }
        for (i=0; i<n; i++) {
            if (array[i]%2 == 0){
                b[j] = array[i];
                j++;
            }
        }

        for (i=0; i<n; i++) {
            array[i] = b[i];
        }
    }

    /**
     * 采用的冒泡交换以及快速排序的思想:
     * 设定两个游标,游标分别用来标记奇数和偶数的下标,然后交换二者
     * 注意交换二者是无法保证顺序的,交换的ij之间还有进行平移。
     * */
    public void reOrderArray(int [] array) {

        int n,i,j,temp,p;

        n = array.length;
        i = 0;
        j = 0;
        while (i<n && j<n) {
            // i标记偶数下标
            while (i<n) {
                if (array[i]%2 ==0){
                    break;
                } else {
                    i++;
                }
            }
            j = i;
            // j标记奇数下标
            while (j<n) {
                if (array[j]%2 !=0){
                    break;
                } else {
                    j++;
                }
            }
            if (i<n && j<n) {
                // 此时ij已经在遇到的第一个偶数和奇数停下,把ij之间的内容平移
                temp = array[j];
                for (p=j; p>i; p--) {
                    array[p] = array[p-1];
                }
                array[i] = temp;
                // 此时把i,j标记到 未交换前的偶数位置的下一个
                i ++;
                j = i;
            }
        }
    }

    public static void main(String[] args) {
        int[] a = {1,4,6,3,2,5,8};
        int[] b = {2,4,6,1,3,5,7};
        new OddEven().reOrderArray(b);
        System.out.println(Arrays.toString(b));
    }
}

【思考】

显然,创建新数组的方式,是一种取巧的方式,题目要求是需要在本数组上进行操作,第二种方式就是采用在本数组上进行操作的,而这种双游标递进的方式跟快速排序的思想很接近。

相关推荐:java入门

以上是java面试中常见的数组题目汇总(二)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

Laravel Lazy Loading与急切的加载 Laravel Lazy Loading与急切的加载 Jul 28, 2025 am 04:23 AM

懒加载在访问关联时才查询,易导致N 1问题,适合不确定是否需要关联数据的场景;2.急加载使用with()提前加载关联数据,避免N 1查询,适合批量处理场景;3.应优先使用急加载优化性能,可通过LaravelDebugbar等工具检测N 1问题,并谨慎使用模型的$with属性以避免不必要的性能开销。

将PHP与机器学习模型集成 将PHP与机器学习模型集成 Jul 28, 2025 am 04:37 AM

usearestapitobridgephpandmlmodelsbyrunningthemodelinpythonviaflaskorfastapiandcallingitfromphpusingcurlorguzzle.2.runpythonscriptsdirectsdirectlyectlyectlyfromphpsingexec()orshell_exec()orshell_exec()orshell_exec()

Laravel Raw SQL查询示例 Laravel Raw SQL查询示例 Jul 29, 2025 am 02:59 AM

Laravel支持使用原生SQL查询,但应优先使用参数绑定以确保安全;1.使用DB::select()执行带参数绑定的SELECT查询,防止SQL注入;2.使用DB::update()执行UPDATE操作并返回影响行数;3.使用DB::insert()插入数据;4.使用DB::delete()删除数据;5.使用DB::statement()执行如CREATE、ALTER等无结果集的SQL语句;6.推荐在QueryBuilder中使用whereRaw、selectRaw等方法结合原生表达式以提升安

带有项目反应堆和弹簧WebFlux的Java的反应性编程 带有项目反应堆和弹簧WebFlux的Java的反应性编程 Jul 29, 2025 am 12:04 AM

响应式编程在Java中通过ProjectReactor和SpringWebFlux实现高并发、低延迟的非阻塞服务。1.ProjectReactor提供Mono和Flux两个核心类型,支持声明式处理异步数据流,并通过操作符链进行转换、过滤等操作;2.SpringWebFlux基于Reactor构建,支持注解式和函数式两种编程模型,运行在Netty等非阻塞服务器上,可高效处理大量并发连接;3.使用WebFlux Reactor能提升I/O密集型场景下的并发能力与资源利用率,天然支持SSE、WebSo

在Java中使用Mapstruct进行无痛豆地图 在Java中使用Mapstruct进行无痛豆地图 Jul 28, 2025 am 03:20 AM

MapStruct是一个编译时代码生成器,用于简化JavaBean之间的映射。1.它通过定义接口自动生成实现类,避免手动编写冗长的set/get映射代码;2.具备类型安全、无运行时开销、支持自动映射同名字段、自定义表达式、嵌套对象和集合映射等特性;3.可与Spring集成,使用@Mapper(componentModel="spring")将mapper注入为Springbean;4.配置简单,只需引入mapstruct依赖和annotationProcessorPaths插

记事本查找并替换为正则捕获组 记事本查找并替换为正则捕获组 Jul 28, 2025 am 02:17 AM

在Notepad 中使用正则表达式捕获组可有效重组文本,首先需打开替换对话框(Ctrl H),选择“搜索模式”为“正则表达式”,1.使用()定义捕获组,如(\w )捕获单词;2.在替换框中用\1、\2引用对应组;3.示例:交换姓名“JohnDoe”为“Doe,John”,查找(\w )\s (\w ),替换为\2,\1;4.日期格式转换2023-12-25为25/12/2023,查找(\d{4})-(\d{2})-(\d{2}),替换为\3/\2/\1;5.日志重排可提取时间、级别、ID等信息

优化Java应用程序中的内存使用率 优化Java应用程序中的内存使用率 Jul 28, 2025 am 02:40 AM

使用效率效率DatAstructuresLikeArrayLinkedLinkedLinkedListAndPrimitiveCollectionStoreCuceOverHead; 2.MinimizeObjectCreationByReosizobsobjects,usingsTringBuilderBuilderForforConcatenation,andCachingInation,andCachingingObjects; 3.PreventMemoryLeakSbySbyNullifyingReperences,lunterStatics interStatics interstatics

python三元操作员示例 python三元操作员示例 Jul 28, 2025 am 02:57 AM

Python的三元运算符用于简洁地实现if-else判断,其语法为“value_if_trueifconditionelsevalue_if_false”;1.可用于简单赋值,如根据数值正负返回对应字符串;2.可避免除零错误,如判断分母非零再进行除法;3.可在字符串格式化中根据条件选择内容;4.可在列表推导式中为不同元素分配标签;需注意该运算符仅适用于二分支情况,不宜多层嵌套,复杂逻辑应使用传统if-elif-else结构以保证可读性。

See all articles