左神中期提升班四

2023-10-31 13:30
文章标签 提升 中期 左神 班四

本文主要是介绍左神中期提升班四,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.超级洗衣机(leetcode517)

贪心策略:本题很容易就求出能否使得洗衣机能否满足的情况,之后遍历每个节点,以该节点为中心,求出使得该节点两边整体平均所需要的最小步数。

设节点N左边高出平均值avg的值为left右边为right

1. 若left<0&&right<0 此时两边都需要节点N补充,至少需要left+right步骤

2. 若left和right至少一个大于0 ,至少需要max(|left|,|right|)步  

经过上面计算求出了以某个节点为中心,使得该节点两边整体平均所需要的最小步数。若要求出每个节点平均,至少使其能够分块平均,要满足每个节点都能分块平均,所以要满足其中的最大值。

在满足最大的分块平均时,其左右两边都是可以并行增删使得节点值靠近平均数,通过自己试算,都可以通过并行使得在满足最大的分块平均时进行调用。

 public int findMinMoves(int[] machines) {int length = machines.length;int sum = 0;for(int i = 0;i<length;i++){sum+=machines[i];}if(sum%length!=0)return -1;int avg = sum/length;int leftSum = 0;int ans = 0;for(int i = 0;i<length;i++){int left = leftSum-avg*i;int right = (sum-leftSum-machines[i])-avg*(length-1-i);if(left<0&&right<0){ans=Math.max(ans,Math.abs(left+right));}else{ans=Math.max(ans,Math.max(Math.abs(left),Math.abs(right)));}leftSum+=machines[i];}return ans;}

2、二维数组旋转问题zigzag打印(整体思想)

思路:打印时按照对角线打印,所以将对角线看成一个个独立的整体,分别遍历对角线 

private static void zigzag(int[][] matrix) {int upX = 0;int upY = 0;int downX = 0;int downY = 0;boolean flag = true;while(upX<=matrix.length){printM(matrix,upX,upY,downX,downY,flag);if (upY<matrix[0].length-1){upY++;}else {upX++;}if (downX<matrix.length-1){downX++;}else {downY++;}flag=!flag;}}private static void printM(int[][] matrix, int upX, int upY, int downX, int downY, boolean flag) {if (flag){while (downX!=(upX-1)){System.out.println(matrix[downX--][downY++]);}}else {while (upX!=(downX+1)){System.out.println(matrix[upX++][upY--]);}}}

3.螺旋打印数组(整体思想)

 思路:同上题类型,将数组一层一层地看成一个整体,这样就只用考虑每一层的情况

private static void rotatePrint(int[][] matrix) {int upX = 0;int upY = 0;int downX = matrix.length-1;int downY = matrix[0].length-1;while (upX<=downX&&upY<=downY){PrintM(matrix,upX,upY,downX,downY);upX+=1;upY+=1;downX-=1;downY-=1;}}private static void PrintM(int[][] matrix, int upX, int upY, int downX, int downY) {if (upX==downX){for (int i = upY; i <=downY ; i++) {System.out.println(matrix[upX][i]);}}else if (upY==downY){for (int i = upX; i <=downX; i++) {System.out.println(matrix[i][upY]);}}else{for (int i = upY;  i<downY ; i++) {System.out.println(matrix[upX][i]);}for (int i = upX; i<downX; i++) {System.out.println(matrix[i][downY]);}for (int i = downY; i >upX; i--) {System.out.println(matrix[downX][i]);}for (int i = downX; i > upX; i--) {System.out.println(matrix[i][upY]);}}}

4.顺时针旋转数组

思考:本题同样用到整体思想,一个n×n矩阵,将矩阵按不同层分组,分成n/2组,在每一组内,按照0 3 15 12 0的顺序依次旋转,第一行德1、2同理,共需循环n-1次,设开始点为M[a][i],则一次循环内的点依次为M[a+1][d] 、M[c][d-i]、M[c-i][b]; 

 private static void rotate1(int[][] matrix) {int upX = 0;int upY = 0;int downX = matrix.length-1;int downY = matrix[0].length-1;while (upX<downX){rotate2(matrix,upX,upY,downX,downY);upX+=1;upY+=1;downX-=1;downY-=1;}}private static void rotate2(int[][] matrix, int a, int b, int c, int d) {for (int i = 0; i < d-b; i++) {int cur = matrix[a][b+i];int next = matrix[a+i][d];matrix[a+i][d]=cur;cur = next;next = matrix[c][d-i];matrix[c][d-i]=cur;cur=next;next = matrix[c-i][b];matrix[c-i][b] = cur;matrix[a][b+i]=next;}}

5.质数问题 

 思路:设某一步时 m=k*a;此时再经过一次步骤一,m=ka,s=2ka;m由s决定,s只能翻倍或+m,则以后s=n*k*m,s必为k的倍数,

当k==1时,nk可以为质数,

 k!=1时,nk只能为合数 

所以s长度为n时,若n为质数,只能第一步使用操作一,其最终步数只能为n-1;

若n为合数则可以将n分为若干个质数的积,n=k1*k2*k3*k4....;若要使得最小的操作步骤,则应该尽可能的调用步骤一,将n分成质数的相乘操作正好对应步骤一的翻倍操,如将k1*k2*k3看成整体,要翻k4倍,k4是质数;此时先调用步骤一:m=(k1*k2*k3),s =2(k1*k2*k3),再调用n-2步操作二,共k4-1步;这一步相当于于将多个a看成一个a拼到长度为s

private static int minOps(int n) {if(n<2)return 0;if(isPrim(n))return n-1;int[] result = lengthAndSum(n);return result[0]-result[1];}private static int[] lengthAndSum(int n) {int sum=0;int count =0;for (int i = 2; i <=n; i++) {while (n%i==0){count+=1;sum+=i;n=n/i;}}return new int[]{sum, count};}private static boolean isPrim(int n) {for (int i = 2; i <Math.sqrt(n); i++) {if (n%2==0)return false;}return true;}

6.自定义堆排序问题(使用排行榜方式解决)

思路: 本题可以定义一个大根堆找出最大的前k个,同时也可以用一个大小为k的小根堆,小根堆顶为最小值,若某个元素个数大于最小值,才可以进入小根堆。本题采用的一种动态方式,不是最简单解决方法,但是可以通过遍历不断更新排行榜。

 private static void getMost(char[] arr, int k) {char[] heap = new char[k];//堆中节点个数int index = 0;for (int i = 0; i < arr.length; i++) {char c= arr[i];//元素在堆中位置int preIndex = -1;if (!mapCount.containsKey(c)){mapCount.put(c,1);mapLocate.put(c,-1);}else {mapCount.put(c, mapCount.get(c)+1);preIndex = mapLocate.get(c);}//堆中无此节点if (preIndex==-1){if(index==k){// 与守门员判断if (mapCount.get(heap[0])<mapCount.get(c)){mapLocate.put(heap[0],-1);heap[0] = c;heapify(0,index, heap);}}else{//直接加入heap[index]=c;mapLocate.put(c,index);heapInsert(index++,c,heap);}}else{heapify(preIndex,index,heap);}}System.out.println(Arrays.toString(heap));}private static void heapify(int k, int index, char[] heap) {char c = heap[k];int count = mapCount.get(c);int i = 2*k+1;while(i<index){int minIndex = i+1<index&&mapCount.get(heap[i+1])<mapCount.get(heap[i])?i+1:i;int min = mapCount.get(heap[minIndex])<count?minIndex:k;if (min==k){break;}mapLocate.put(heap[min],k);heap[k]= heap[min];k=min;i=2*k+1;}heap[k]=c;}private static void heapInsert(int i, char c, char[] heap) {while (mapLocate.get(heap[(i-1)/2])>mapLocate.get(heap[i])){mapLocate.put(heap[(i-1)/2],i);heap[i]=heap[(i-1)/2];i = (i-1)/2;}heap[i]=c;mapLocate.put(c,i);}

这篇关于左神中期提升班四的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/315700

相关文章

java学习,进阶,提升

http://how2j.cn/k/hutool/hutool-brief/1930.html?p=73689

JAVA用最简单的方法来构建一个高可用的服务端,提升系统可用性

一、什么是提升系统的高可用性 JAVA服务端,顾名思义就是23体验网为用户提供服务的。停工时间,就是不能向用户提供服务的时间。高可用,就是系统具有高度可用性,尽量减少停工时间。如何用最简单的方法来搭建一个高效率可用的服务端JAVA呢? 停工的原因一般有: 服务器故障。例如服务器宕机,服务器网络出现问题,机房或者机架出现问题等;访问量急剧上升,导致服务器压力过大导致访问量急剧上升的原因;时间和

提升PrestaShop外贸电商网站安全的几款行业必备工具

提升PrestaShop外贸电商网站安全的几款行业必备工具 PrestaShop发展历程 PrestaShop是一款优秀且强大的外贸开源电商软件,我们开始使用PrestaShop始于2009年,那时PrestaShop还是0.9版本:界面清新,性能强悍,扩展友好等特性,既没有Magento的笨重,也没有ZenCart的古老,更没有OpenCart的脆弱,因此PrestaShop如雨后春笋,迅速

Axure元件库Ant Design中后台原型模板:提升设计与开发效率的利器

企业对于中后台产品的设计与开发需求日益增长。为了提升用户体验和开发效率,设计者和开发者们不断寻求更加高效、统一的解决方案。Ant Design,作为阿里巴巴开源的一套企业级UI设计语言和React组件库,凭借其丰富的组件和统一的设计风格,已成为众多项目的首选。而在Axure中使用Ant Design元件库,更是为中后台产品的原型设计带来了极大的便利。 Ant Design简介 Ant D

【JavaScript】let与var的区别及变量、函数提升

有var与无var的区别   在函数内部,有var和没var声明的变量是不一样的。有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口。 let与var的区别   在上面代码中,我们使用var语句声明变量x。因此,变量x的范围是函数范围。if语句内的变量x就是if语句外创建的变量x。因此,在你修改if语句块内变量x的值的时候,也会修改函数中变量x的所有引用的

如何通过食堂采购小程序端降低成本,提升效率?

随着数字化管理工具的普及,越来越多的食堂正在引入小程序来优化采购流程,减少成本和提升效率。食堂采购小程序端通过技术手段实现了自动化、智能化的管理方式,为管理者提供了极大的便利。本文将探讨如何利用技术手段开发一个高效的食堂采购小程序端,并提供一些代码示例,帮助你理解其背后的实现原理。 1. 简化采购流程 在食堂采购小程序中,简化采购流程是核心目标之一。我们可以利用数据库和后端服务来实现快速下单

自我提升社团成立啦,欢迎各位同学加入~

欢迎加入 大家好,我是马丁,我们的自我提升社团成立啦,欢迎有新的朋友加入!! 我们的社团主要目标是帮助每个人实现自我成长、自我提升,不论他是什么年龄、什么经验、什么专业,只要有一个好学和想进步的心,都可以加入。 为了提升帮助每个人实现自我成长,目前社团选择的是做一个智能客服系统,我们希望通过搭建一个企业级的智能客服系统来帮助每个人实现自我成长。后续,还会开发更多系统~ 目前群里大多是Jav

全能AI神器!工作效率提升80倍!Zmo.ai带你玩转AI做图!

今天,我要给大家介绍一款神器:Zmo.ai。 这个平台简直是做图神器,集多种功能于一身,让你像专业人士一样轻松创建和编辑图像,不需要任何美术与设计基础,真的非常适合我们这些“手残党”! 我们只需单击按钮即可从文本或图像生成令人惊叹的 AI 艺术、图像、动漫和逼真的照片,最关键的是它的功能真的很全啊! Zmo.ai旗下产品分类: AI照片生成器 AI动漫生成器 AI照片编辑器 A

Xinstall助力App全渠道统计,参数传递下载提升用户体验!

在移动互联网时代,App已成为我们日常生活中不可或缺的一部分。然而,对于App开发者来说,如何有效地推广和运营自己的应用,却是一个不小的挑战。尤其是在面对众多渠道、复杂的数据统计和用户需求多样化的情况下,如何精准地触达目标用户,提升用户的下载、安装和活跃度,更是考验着每一个运营者的智慧。 今天,我们就来揭秘一个能够帮助App开发者解决这些痛点的神器——Xinstall。作为一家一站式App全渠道

【C++】优化函数对象:提升性能和内存效率

函数对象 =》c语言里面的函数指针对象构造优化对象使用过程中背后调用的方法函数调用过程中对象背后调用方法:优化原则move,forward 函数对象 =》c语言里面的函数指针 通过函数对象调用operator(),可以省略函数的调用开销,比通过函数指针调用函数(不能够inline内联调用)效率高因为函数对象是用类生成的,所有还可以添加相关的成员变量,用来记录函数对象使用时的更