小试牛刀——牛客篇

简介: 小试牛刀——牛客篇

@TOC

一、消失的数字

数组 nums 包含从 0 到 n 的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。在 O(n)时间内完成
在这里插入图片描述
1.异或运算:

 public int missingNumber(int[] nums) {
        int[] arr = new int[nums.length + 1];
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum ^= i;
        }
        for (int i = 0; i < nums.length ; i++) {
            sum ^= nums[i];
        }
        return sum;
    }

2.空间换时间:

public int missingNumber1(int[] nums) {
        int[] arr = new int[nums.length+1];
        for (int i = 0; i < nums.length; i++) {
            arr[nums[i]] = 1;
        }
        for (int i = 0; i < arr.length; i++) {
            if(arr[i] != 1) {
                return i;
            }
        }
        return -1;
    }

二、轮转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数
在这里插入图片描述
这是之前写过一篇专门是旋转数组的:旋转数组三种方式
上面的思路是针对于左旋数组,对右旋数组只需要稍加修改即可

public static void reverse(int[] arr,int left,int right) {
        while(left < right) {
            int ret = arr[left];
            arr[left] = arr[right];
            arr[right] = ret;
            left++;
            right--;
        }
    }
    public static void rotate(int[] nums, int k) {
        k = k % nums.length;
        reverse(nums,0,nums.length-1);
        reverse(nums,0,k-1);
        reverse(nums,k,nums.length-1);

        System.out.println(Arrays.toString(nums));
    }

三、存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false

public boolean containsDuplicate(int[] nums) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if(map.containsKey(nums[i])) {
                return true;
            }
            map.put(nums[i],i);
        }
        return false;
    }

四、寻找峰值

给定一个长度为n的数组nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。
1.峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于
2.假设 nums[-1] = nums[n] = -\infty−∞
3.对于所有有效的 i 都有 nums[i] != nums[i + 1]
4.你可以使用O(logN)的时间复杂度实现此问题吗?
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

public static int findPeakElement (int[] nums) {
        if(nums == null || nums.length == 0) {
            return -1;
        }
        if(nums.length == 1) {
            return 0;
        }
        if(nums[0] > nums[1]) {
            return 0;
        }
        if(nums[nums.length-1] > nums[nums.length-2]) {
            return nums.length - 1;
        }
        int left = 0;
        int right = nums.length - 1;
        while(left < right) {
            int mid = (left + right) / 2;
            if(nums[mid] < nums[mid+1]) {
                left = mid + 1;
            }else {
                right = mid;
            }
        }
        return left;
    }

五、珠玑妙算游戏

计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。
给定一种颜色组合solution和一个猜测guess,编写一个方法,返回猜中和伪猜中的次数answer,其中answer[0]为猜中的次数,answer[1]为伪猜中的次数。

public static int[] masterMind(String solution, String guess) {
        int[] arr = new int[2];
        char[] ch = solution.toCharArray();
        char[] c = guess.toCharArray();
        for (int i = 0; i < c.length; i++) {
            if(c[i] == ch[i]) {
                arr[0]++;
                ch[i] = 0;
                c[i] = 1;
            }
            }
        for (int i = 0; i < c.length; i++) {
            for (int j = 0; j < guess.length(); j++) {
                if(c[i] == ch[j]) {
                    ch[j] = 0;
                    arr[1]++;
                    break;
                }
            }
        }
        return arr;
    }
目录
相关文章
并发和并行以及他们的区别
并发:         并发指的是多个任务交替执行的能力,这些任务可能不是同时执行,而是通过快速切换在不同任务之间来实现“同时执行”的效果。在多核处理器上,多个线程可以真正同时执行,而在单核处理器上,线程之间通过时间片轮转实现并发。         所以当谈论并发的时候一定要加个单位时间,也就是说单位时间内并发量是多少?离开了单位时间其实是没有意义的。 并行:         并行指的是多个任务同时执行的能力,每个任务都在独立的CPU上执行。并行通常用于同时处理独立任务,这些任务可以同时执行,而不需要相互等待或协同工作。 两者区别:         关键区别在于并发强调任务在时间上交替执行
290 0
|
API 开发者
接口开放平台的产品设计脑图及解决方案
接口开放平台的产品设计脑图及解决方案
|
前端开发 JavaScript 定位技术
HTML中target的使用注意点
`target` 属性在 HTML 中主要用于 `&lt;a&gt;` 和 `&lt;form&gt;` 元素,指定链接打开或表单提交的位置。常见值包括 `_self`(当前窗口)、`_blank`(新窗口)、`_parent`(父框架)和 `_top`(整个窗口)。使用 `target=&quot;_blank&quot;` 时应加 `rel=&quot;noopener noreferrer&quot;` 以提高安全性。JavaScript 可动态设置 `target`,CSS 可增强样式。尽管 `target` 主要用于链接和表单,但在特定场景下也可应用于其他元素。
|
11月前
|
存储 数据安全/隐私保护 数据中心
Incus 6.4 容器和虚拟机管理器发布
【10月更文挑战第26天】
392 2
Incus 6.4 容器和虚拟机管理器发布
|
数据采集 Python
Python正则表达式提取车牌号
Python正则表达式提取车牌号
335 0
|
安全 JavaScript 前端开发
C++一分钟之-C++17特性:结构化绑定
【6月更文挑战第26天】C++17引入了结构化绑定,简化了从聚合类型如`std::tuple`、`std::array`和自定义结构体中解构数据。它允许直接将复合数据类型的元素绑定到单独变量,提高代码可读性。例如,可以从`std::tuple`中直接解构并绑定到变量,无需`std::get`。结构化绑定适用于处理`std::tuple`、`std::pair`,自定义结构体,甚至在范围for循环中解构容器元素。注意,绑定顺序必须与元素顺序匹配,考虑是否使用`const`和`&`,以及谨慎处理匿名类型。通过实例展示了如何解构嵌套结构体和元组,结构化绑定提升了代码的简洁性和效率。
263 5
|
存储 安全 Java
Java集合详解:Set, Map, Vector, List的对比与联系
Java集合框架核心包括List、Set、Map和Vector。List允许重复元素,如ArrayList(适合读取)和LinkedList(适合插入删除)。Set不允许重复,有HashSet(无序)和TreeSet(排序)。Map存储键值对,HashMap(无序)和TreeMap(排序)。Vector是线程安全的ArrayList替代品,但在多线程环境下使用。选择集合类型应根据应用场景,如有序、无序、键值对需求及线程安全考虑。
|
存储 JSON Go
Go 命令行框架: 构建强大的命令行工具
Go 命令行框架: 构建强大的命令行工具
|
Unix Linux 应用服务中间件
【Linux】Linux 系统编程——相对路径和绝对路径
【Linux】Linux 系统编程——相对路径和绝对路径
655 1
|
Kubernetes 中间件 数据安全/隐私保护
traefik配置用户登录,限制K8S的web服务访问
像Elastic-APM, Traefik-Dashboard等页面,是没有用户登录限制的,如果我们希望给他们加上用户登录限制,我们需要在traeifk里给对应的ingress添加登录用的Middleware,那么该如何添加呢?本文以给K8S部署的traefik dashboard为例进行添加
915 0
traefik配置用户登录,限制K8S的web服务访问