【2013-12-23】《编程之美》读书笔记:烙饼排序问题
[历史归档]本文原发布于 cstriker1407.info 个人博客内容为历史存档仅供参考。发布时间2013-12-23 标题《编程之美》读书笔记烙饼排序问题分类编程 / java / 编程之美 标签java·编程之美·烙饼排序《编程之美》读书笔记烙饼排序问题第1.3节烙饼排序问题解法1每次翻转最大的拿张通过枚举方法来获取最小的数目最近在学习《 编程之美 》这本书书中提到了很多很经典的算法问题和实现学起来真是耗费脑细胞啊。书中的算法实现使用C编写的这里作者自己写了一部分java的实现如果有错误还请各位读者批评指正。截图版权属于原作者。github【 https://github.com/cstriker1407/think_in_java 】第1.3节烙饼排序问题解法1每次翻转最大的拿张代码如下privatestaticfinalint[]UnSortArr{1,5,3,4};//,6,2,9,8,7};//获取最大值publicstaticintgetMaxSortNum(){LinkedListIntegermiddleListnewLinkedListInteger();for(intitem:UnSortArr){middleList.add(item);}System.out.println(未排序middleList.toString());intreverseTime0;inttotalNummiddleList.size();intnumNoSorttotalNum;while(numNoSort0){/* sublist * 返回列表中指定的 fromIndex包括 和 toIndex不包括之间的部分视图。如果 fromIndex 和 toIndex 相等则返回的列表为空。 * 返回的列表由此列表支持因此返回列表中的非结构性更改将反映在此列表中反之亦然。返回的列表支持此列表支持的所有可选列表操作。 *///从没有排序的list里面找到最大的一个数以及它的IDintmaxNumCollections.max(middleList.subList(0,numNoSort));intmaxNumIdxmiddleList.indexOf(maxNum);//翻转最大数到第一个数之间的所有的数据Collections.reverse(middleList.subList(0,maxNumIdx1));System.out.println(找到最大数[maxNum]并翻转middleList.toString());reverseTime;//翻转第一个数和没有排序的最后一个数间的所有数据Collections.reverse(middleList.subList(0,numNoSort));System.out.println(将最大数翻到底部middleList.toString());reverseTime;//没有排序的数据个数--numNoSort--;}System.out.println(总数:totalNum 翻转次数为reverseTime);returnreverseTime;}Java的关于list的工具类比较多也比较好用实现起来相对容易一点。通过枚举方法来获取最小的数目首先备份下用到的工具函数//判断是否排序OKprivatestaticbooleanisListSorted(LinkedListIntegermiddleList){for(inti1;imiddleList.size();i){if(middleList.get(i-1)middleList.get(i)){returnfalse;}}returntrue;}使用递归的方法在上一次翻转的基础上进行二次翻转/* *在当前已经进行部分翻转的list上面进行下一次的翻转并且对翻转的序号x【0x】进行遍历 *times表示当前已经翻转的次数 */privatestaticvoidinternalSort(LinkedListIntegermiddleList,inttimes){//已经排序OK不用再测试了。if(isListSorted(middleList)){//记录最小值minSortNumtimesminSortNum?times:minSortNum;return;}/* *加速判断根据getMaxSortNum函数的测试可以发现最大值为数据list长度的2倍因此当 *当前的翻转数目 估计剩余的最小翻转数 middleList.size() * 2可以认为这次翻转已经没有意义了 */if(timesgetMinSortNum()maxSortNum){return;}/* * 既然不知道如何翻转数目最小那我们就遍历在当前已经部分翻转之后的list上进行二次翻转每次翻转的个数【i】进行遍历。 * 翻转完成之后将数据还原方便下次翻转。 */for(inti0;imiddleList.size();i){Collections.reverse(middleList.subList(0,i1));internalSort(middleList,times1);Collections.reverse(middleList.subList(0,i1));}}为了加速计算减少不必要的递归我们计算出翻转次数的上下限。下限是估计出来的//获取最小估计值不准确。publicstaticintgetMinSortNum(){intnum0;for(inti1;iUnSortArr.length;i){//如果相邻的两个饼的大小也相邻那么就可以认为这两个饼是一个整体if(UnSortArr-UnSortArr1||UnSortArr-UnSortArr-1){}else{num;}}returnnum;}最后是入口测试函数publicclassSortTest{privatestaticfinalint[]UnSortArr{1,5,3,4};//,6,2,9,8,7};//最小的翻转次数privatestaticintminSortNumInteger.MAX_VALUE;//最大的翻转次数privatestaticintmaxSortNum-1;//在当前已经进行部分翻转的list上面进行下一次的翻转publicstaticvoidtestSort(){maxSortNumgetMaxSortNum();LinkedListIntegermiddleListnewLinkedListInteger();for(intitem:UnSortArr){middleList.add(item);}System.out.println(未排序middleList.toString());internalSort(middleList,0);System.out.println(最小数目minSortNum);System.out.println(最大数目maxSortNum);}//判断是否排序OKprivatestaticbooleanisListSorted(LinkedListIntegermiddleList){。。。。。。}/* *在当前已经进行部分翻转的list上面进行下一次的翻转并且对翻转的序号x【0x】进行遍历 *times表示当前已经翻转的次数 */privatestaticvoidinternalSort(LinkedListIntegermiddleList,inttimes){。。。。。。}//获取最小估计值不准确。publicstaticintgetMinSortNum(){。。。。。。}//获取最大值publicstaticintgetMaxSortNum(){。。。。。。}}

相关新闻

米家72LW-PL30/N1A1立柜空调评测:巨省电与大风口技术解析

米家72LW-PL30/N1A1立柜空调评测:巨省电与大风口技术解析

最近天气越来越热,很多朋友都在考虑给家里添置一台新空调。特别是客厅面积较大的家庭,立柜式空调成了首选。今天要跟大家详细聊聊米家新推出的这款72LW-PL30/N1A1立柜式空调,看看它宣称的"巨省电"和"大风口"到底是不是真…

2026/7/15 5:59:23 阅读更多 →
C#实现ModbusRTU详解【二】—— 解析响应报文

C#实现ModbusRTU详解【二】—— 解析响应报文

1. ModbusRTU响应报文基础解析当你用C#发送完ModbusRTU读取请求后,设备返回的响应报文就像一封装满数据的快递包裹。拆解这个包裹需要遵循特定规则,否则就会像拆错快递一样尴尬。响应报文的标准结构是这样的:[站地址][功能码][数据字节数][数…

2026/7/15 5:57:22 阅读更多 →
计算机网络期末复习:从MOOC习题到实战思维导图

计算机网络期末复习:从MOOC习题到实战思维导图

1. 从MOOC习题到思维导图:构建高效复习体系华南理工大学的计算机网络MOOC课程以"7张思维导图"为核心学习方法,这恰恰是期末复习的最佳切入点。我当年备考时发现,直接刷题容易陷入"只见树木不见森林"的困境,而…

2026/7/15 5:57:22 阅读更多 →

最新新闻

WeChatMsg:重新定义你的微信记忆管理方式

WeChatMsg:重新定义你的微信记忆管理方式

WeChatMsg:重新定义你的微信记忆管理方式 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg 你…

2026/7/15 7:07:54 阅读更多 →
ok-ww:鸣潮自动化效率工具终极指南,解放双手的完整解决方案

ok-ww:鸣潮自动化效率工具终极指南,解放双手的完整解决方案

ok-ww:鸣潮自动化效率工具终极指南,解放双手的完整解决方案 【免费下载链接】ok-wuthering-waves 鸣潮 后台自动战斗 自动刷声骸 一键日常 Automation for Wuthering Waves 项目地址: https://gitcode.com/GitHub_Trending/ok/ok-wuthering-waves …

2026/7/15 7:05:53 阅读更多 →
火山引擎GLM5.2大模型API接入实战:免费额度使用与优化策略

火山引擎GLM5.2大模型API接入实战:免费额度使用与优化策略

最近在技术社区看到不少开发者讨论大模型API的免费额度问题,特别是火山引擎平台上的智谱GLM5.2模型。作为技术实践者,我理解大家希望低成本体验最新AI能力的想法,但更重要的是掌握正确的接入方法和使用规范。本文将系统介绍GLM5.2的技术特性、…

2026/7/15 7:05:53 阅读更多 →
foobar2000终极美化指南:一键打造个性化音乐播放器

foobar2000终极美化指南:一键打造个性化音乐播放器

foobar2000终极美化指南:一键打造个性化音乐播放器 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn foobox-cn是foobar2000播放器的终极美化配置方案,通过创新的DUI界面设计和丰…

2026/7/15 7:01:51 阅读更多 →
终极指南:如何打造专业级音乐播放体验——foobox-cn完整配置教程

终极指南:如何打造专业级音乐播放体验——foobox-cn完整配置教程

终极指南:如何打造专业级音乐播放体验——foobox-cn完整配置教程 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 如果你追求极致音乐播放体验,想要让经典的foobar2000焕发新生…

2026/7/15 7:01:51 阅读更多 →
Silero VAD语音活动检测技术:企业级深度学习解决方案

Silero VAD语音活动检测技术:企业级深度学习解决方案

Silero VAD语音活动检测技术:企业级深度学习解决方案 【免费下载链接】silero-vad Silero VAD: pre-trained enterprise-grade Voice Activity Detector 项目地址: https://gitcode.com/GitHub_Trending/si/silero-vad Silero VAD作为企业级预训练语音活动检…

2026/7/15 6:57:49 阅读更多 →

日新闻

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO11 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向红外小目标检测的时空特征融合模块——STFFM,用于增强复杂背景下目标与噪声、杂波的区分能力。该方法通过拼接空间特征与时间/运动特征,并结合通道注意力、空间注意力和残差增强机制,实现对关键语义通道与疑似目标区域的…

2026/7/15 0:01:00 阅读更多 →
YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

YOLO26 改进 - 特征融合 | STFFM空间时间特征融合模块,强化时空互补、抑制噪声,助力小目标检测高效涨点

前言 本文介绍了面向复杂背景小目标检测的时空特征融合模块——STFFM。该模块通过空间分支与时间/运动分支的特征拼接,引入通道注意力和空间注意力对融合特征进行自适应筛选,并结合残差增强与通道压缩,突出目标区域、抑制背景噪声。我们将 S…

2026/7/15 0:01:00 阅读更多 →
行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

行星减速机为什么能提高扭矩?从功率守恒到输出扭矩校核

一、为什么减速以后扭矩会增大 旋转机械的功率、转速和扭矩之间存在以下关系: T 9550 P n 其中: T为扭矩,单位Nm; P为功率,单位kW; n为转速,单位r/min。 在功率基本不变的情况下:…

2026/7/15 0:03:00 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/14 16:53:23 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/14 14:00:13 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/14 7:15:24 阅读更多 →

月新闻