⚡每日算法&面试题⚡一起肥学4️⃣

Posted 肥学

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了⚡每日算法&面试题⚡一起肥学4️⃣相关的知识,希望对你有一定的参考价值。

导读

小伙伴们新的学期又要开始了,您是否已经做好了冲刺的准备了呢?如果您想在这个学期收获的比别人更多我建议给肥肥点个关注。我们一起来增长知识,无论你是考研还是找工作或者是要加薪。这里都是一个不错的选择。让我们红尘作伴,一起肥学!!!

🐳算法题

整数数组 nums 按升序排列,数组中的值 互不相同 。

在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为
[nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …,
nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为
[4,5,6,7,0,1,2] 。

给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1

示例 1:

输入:nums = [4,5,6,7,0,1,2], target = 0
输出:4
示例 2:

输入:nums = [4,5,6,7,0,1,2], target = 3
输出:-1
示例 3:

输入:nums = [1], target = 0
输出:-1
 
提示:

1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
nums 中的每个值都 独一无二
题目数据保证 nums 在预先未知的某个下标上进行了旋转
-10^4 <= target <= 10^4
 

进阶:你可以设计一个时间复杂度为 O(log n) 的解决方案吗?

🐳一点点思路

这道题我刚开始做的时候觉得他是旋转数组的谁知道来了这么一套,只是让查个坐标。好吧我们总结一下常用的搜索的算法有哪些:

  • 二分查找
  • 二叉树查找
  • 哈希表

这里我们就用简单点的二分查找法吧。

🐳源码和解析

class Solution {
    public int search(int[] nums, int target) {
        int n = nums.length;
        if (n == 0) {
            return -1;
        }
        if (n == 1) {
            return nums[0] == target ? 0 : -1;
        }
        
        int l = 0, r = n - 1;
        while (l <= r) {
        //二分的灵魂找到中间坐标
            int mid = (l + r) / 2;
            //纯属碰运气
            if (nums[mid] == target) {
                return mid;
            }
            //以 [4,5,6,7,0,1,2] 为例旋转完后的数组前几个是升序
            //这个判断的结果可以说明从开头到中间是不是一直升序
            if (nums[0] <= nums[mid]) {
                if (nums[0] <= target && target < nums[mid]) {
                    r = mid - 1;//移动右指针
                } else {
                    l = mid + 1;//移动左指针
                }
            } else {//同样道理
                if (nums[mid] < target && target <= nums[n - 1]) {
                    l = mid + 1;
                } else {
                    r = mid - 1;
                }
            }
        }
        return -1;
    }
}


🐳面试题

CPU利用率和CPU负载的区别是什么

提到CPU利用率,就必须理解时间片。什么是CPU时间片?是分时操作系统分配给每个正在运行的进程微观上的一段CPU时间(在抢占内核中是:从进程开始运行直到被抢占的时间)我们现在所使用的Windows、Linux、Mac
OS都是“多任务操作系统”,就是说他们可以“同时”运行多个程序,比如一边打开浏览器浏览网页还能一边听音乐。

但是,实际上一个CPU内核在同一时刻只能干一件事,那操作系统是如何实现“多任务”的呢?大概的方法是让多个进程轮流使用CPU一小段时间,由于这个“一小段时间”很短(在linux上为5ms-800ms之间),用户感觉不到,就好像是几个程序同时在运行了。上面提到的“一小段时间”就是我们所说的CPU时间片,CPU的现代分时多任务操作系统对CPU都是分时间片使用的。

CPU使用率,就是程序对CPU时间片的占用情况,即CPU使用率 = CPU时间片被程序使用的时间 /
总时间。比如A进程占用10ms,然后B进程占用30ms,然后空闲60ms,再又是A进程占10ms,B进程占30ms,空闲60ms,如果在一段时间内都是如此,那么这段时间内的CPU占用率为40%。CPU利用率显示的是程序在运行期间实时占用的CPU百分比。

大多数操作系统的CPU占用率分为用户态CPU使用率和系统态CPU使用率。用户态CPU使用率是指执行应用程序代码的时间占总CPU时间的百分比。相比而言,系统态CPU使用率是指应用执行操作系统调用的时间占总CPU时间的百分比。系统态的CPU使用率高意味着共享资源有竞争或者I/O设备之间有大量的交互。

而CPU负载显示的是一段时间内正在使用和等待使用CPU的平均任务数。

简单理解,一个是CPU的实时使用情况,一个是CPU的当前以及未来一段时间的使用情况。举例来说:如果我有一个程序它需要一直使用CPU的运算功能,那么此时CPU的使用率可能达到100%,但是CPU的工作负载则是趋近于“1”,因为CPU仅负责一个工作嘛!如果同时执行这样的程序两个呢?CPU的使用率还是100%,但是工作负载则变成2了。所以也就是说,CPU的工作负载越大,代表CPU必须要在不同的工作之间进行频繁的工作切换。无论CPU的利用率是高是低,跟后面有多少任务在排队(CPU负载)没有必然关系。

如果单核CPU的话,负载达到1就代表CPU已经达到满负荷的状态了,超过1,后面的进行就需要排队等待处理了。如果是是多核多CPU,假设现在服务器是2个CPU,每个CPU有2个核,那么总负载不超过4都没什么问题。

可以通过uptime、w命令查看CPU平均负载,使用top命令还能看到CPU负载总体使用率以及各个进程占用CPU的比例。

特别介绍

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个面试和考研的算法练习我们一起加油上岸之路

以上是关于⚡每日算法&面试题⚡一起肥学4️⃣的主要内容,如果未能解决你的问题,请参考以下文章

⚡每日算法&面试题⚡一起肥学1️⃣1️⃣(面试linux命令)

⚡每日算法&面试题⚡一起肥学6️⃣

⚡每日算法&面试题⚡一起肥学1️⃣0️⃣( 含 HashMap& TreeMap)

⚡每日算法&面试题⚡一起肥学7️⃣

⚡每日算法&面试题⚡一起肥学5️⃣

⚡每日算法&面试题⚡一起肥学8️⃣