对《培養與鍛鍊程式設計的邏輯腦(第二版)》的笔记(2)
-
Chapter 1 遞增法 Incremental Method
利用一個變數,暫存其中一個數字,以便對調。
- void swap_int()
- {
- int a=0,b=1;
- //交換a與b
- int temp=a;
- a=b;
- b=temp;
- cout<<a<<''<<b;
- }
- void swap_int(int&a,int&b)
- {
- int temp=a;
- a=b;
- b=temp;
- }
-
Chapter 3 枚舉法 Enumerative Method
範例:平面上距離最近的兩個點( Closest Pair )
第一層枚舉第一個點,第二層枚舉第二個點。為了避免重複枚舉相同的一對點,第二層只枚舉索引值更高的點。
- void closest_pair()
- {
- float point[10][2]=
- {
- {3,3},{1,5},{4,6},{2,8},{9,9},
- {2,1},{7,2},{6,5},{9,4},{5,9}
- };
- //距離最近的兩個點的距離
- float d=1e9;
- //枚舉第一點
- for(int i=0;i<10;i++)
- //枚舉第二點
- for(int j=i+1;j<10;j++)
- {
- //計算第一點到第二點的距離
- float dx=point[i][0]-point[j][0];
- float dy=point[i][1]-point[j][1];
- float dij=sqrt(dx*dx+dy*dy);
- //記錄最短的距離
- if(dij<d)d=dij;
- }
- cout<<"距離是"<<d;
- }
可以把計算距離的程式碼,抽離出來成為一個函式。好處是程式碼變得清爽許多,增加程式碼可讀性。壞處是大量呼叫函式,導致執行速度變慢。
- struct Point{float x,y;};
- //計算兩點之間的距離
- float dist(Point a,Point b)
- {
- float dx=a.x-b.x;
- float dy=a.y-b.y;
- return sqrt(dx*dx+dy*dy);
- }
- void closest_pair()
- {
- Point point[10]=
- {
- {3,3},{1,5},{4,6},{2,8},{9,9},
- {2,1},{7,2},{6,5},{9,4},{5,9}
- };
- float d=1e9;
- for(int i=0;i<10;i++)
- for(int j=i+1;j<10;j++)
- //記錄最短的距離
- d=min(d,dist(point[i],point[j]));
- cout<<"距離是"<<d;
- }
魚與熊掌不可兼得,這兩種程式碼各有優缺點,沒有絕對的好壞。程式員必須自行取捨。
範例:反轉字串
兩個枚舉,一個從頭到尾,一個從尾到頭,步調相同,逐步對調字元。雖然是兩個枚舉,卻只有一個迴圈。
- void reverse_string()
- {
- char s[15]="HelloWorld!";
- //兩個枚舉,一個從頭到尾,一個從尾到頭。
- for(int i=0,j=12;i<j;i++,j--)
- swap(s[i],s[j]);
- cout<<"反轉之後的字串是"<<s;
- }
- void reverse(char*s)
- {
- int n=strlen(s);
- for(int i=0;i<n/2;i++)
- swap(s[i],s[n-1-i]);
- }
範例:尋找總和為 10 的區間
假設陣列元素只有正數。
兩個枚舉,枚舉區間左端以及枚舉區間右端,都是從頭到尾,保持一左一右,視情況輪流枚舉。雖然是兩個枚舉,卻只有一個迴圈。
- void find_interval()
- {
- int array[5]={3,6,1,7,2};
- int sum=0;
- for(int i=0,j=-1;j<5;)//枚舉區間[i,j]
- {
- if(sum>10)
- {
- //總和太大,區間左端往右縮短。
- sum-=array[i];
- i++;
- }
- else if(sum<10)
- {
- //總和太小,區間右端往右伸長。
- j++;
- sum+=array[j];
- }
- else if(sum==10)
- {
- //總和剛好,
- //區間左端往右縮短,
- //亦得區間右端往右伸長。
- //任選一種皆可。
- //sum-=array[i];
- //i++;
- j++;
- sum+=array[j];
- }
- if(sum==10)
- cout<<'['<<i<<','<<j<<']';
- }
- }
- void find_interval(int array[],int n,int num)
- {
- int sum=0;
- for(int i=0,j=0;j<=n;)//枚舉區間[i,j)
- {
- if(sum>num)
- sum-=array[i++];
- else
- sum+=array[j++];
- if(sum==num)
- cout<<'['<<i<<','<<j-1<<']';
- }
- }
讀者可以想想看:陣列元素若有零、有負數,是否要調整枚舉方式?
範例:尋找陣列之中的特定數字,陣列已經由小到大排序
找到其中一個特定數字:首先找到陣列中央的數字,依其數字大小,繼續搜尋左半段或者右半段。
- void find_number()
- {
- int array[15]=
- {
- 2,3,5,7,11,
- 13,17,19,23,29,
- 31,37,41,43,47
- };
- int left=0,right=15-1;
- while(left<=right)
- {
- int mid=(left+right)/2;
- if(array[mid]<29)
- left=mid+1;//繼續搜尋剩下的右半段
- else if(array[mid]>29)
- right=mid-1;//繼續搜尋剩下的左半段
- else if(array[mid]==29)
- {
- //找到了其中一個數字
- cout<<mid<<':'<<array[mid];
- return;
- }
- }
- cout<<"找不到29";
- }
找到所有特定數字:讀者請自行嘗試。
的其他笔记 · · · · · · ( 全部1110条 )
- 品牌学
- 1
- 万亿指数
- 1
- 人类死亡史
- 3
- 请教机长
- 2
- 预期收益:在不确定市场创造非凡回报
- 9
- 經濟學.INFOGRAPHICS視覺資訊大繪解
- 6
- 民族与民族主义
- 18
- 共產主義
- 2
- On Java 中文版 基础卷
- 1
- 预期收益
- 15
- 阿尔法经济学
- 5
- CFA一级中文教材
- 3
- 我畢業五年,用ETF賺到400萬
- 16
- 人为何需要仪式
- 3
- 投资的常识
- 5
- 图解棒球规则
- 3
- 生存还是毁灭
- 2
- 因子投资
- 6
- 像大师一样投资
- 1
- 致命的海滩
- 1
- FOF投资的量化分析
- 1
- 决战股市终极方案
- 1
- 男权的神话
- 4
- 小乌龟投资智慧2
- 2
- 股票魔法师
- 2
- 每个人的经济学
- 11
- 投资精要
- 3
- 估值:难点、解决方案及相关案例
- 1
- 手把手教你港股打新
- 2
- 从投票到暴力
- 2
- 巴菲特与索罗斯的投资习惯
- 2
- 股市进阶之道
- 7
- 中国股神林园炒股秘籍
- 1
- 彼得·林奇的成功投资
- 8
- 价值的力量
- 1
- 投资至简
- 7
- 债券投资实战
- 1
- 徐远的投资课
- 27
- 原则
- 1
- 從地理看經濟的44堂公開課
- 6
- 完全圖解 從海洋看世界經濟: 從海上貿易、領海攻防, 到石油、天然氣、水產資源的爭奪戰, 看懂世界經濟全貌
- 5
- 慢慢变富
- 3
- 癌症
- 1
- 您厉害,您赚得多
- 4
- 投资中不简单的事
- 9
- 投资中最简单的事
- 7
- 超额收益
- 2
- 股市真规则
- 11
- 股市长线法宝(原书第5版)
- 13
- 大钱细思
- 5
- 共同基金常识
- 8
- 散户自救法则
- 1
- 买入大牛股的9个关键
- 3
- 指数基金投资指南
- 4
- 七堂课穿越牛熊
- 4
- 低风险投资十八种武器
- 6
- 低风险投资之路 (第二版)
- 1
- 投资大白话
- 4
- 你的第一本保险指南
- 6
- 躺着赚钱
- 3
- ETF全球投资指南
- 9
- 投资最重要的事
- 14
- 定投十年财务自由
- 19
- 投资
- 1
- 现代世界的诞生
- 1
- 全球不平等逸史
- 8
- 好好赚钱
- 1
- 有效资产管理
- 4
- 毒家企業
- 1
- how to如何不切实际地解决实际问题
- 1
- 迈向财富自由之路
- 5
- 美国政党与选举
- 6
- 领导力
- 1
- 戏剧
- 1
- 經濟學.視覺資訊全解讀
- 12
- 好的资本主义,坏的资本主义
- 5
- 太阳系三环到四环搬迁纪要
- 1
- 埃及的革命考古學
- 1
- 經濟學人109個世界常識: 藏在5G通訊、表情符號和酒杯尺寸背後的祕密
- 2
- 重构
- 1
- 为什么不平等至关重要
- 1
- 白板
- 7
- 邻人之妻
- 3
- 秘境
- 1
- 白话大数据与机器学习
- 1
- 深度学习入门
- 1
- 怎样玩转信息
- 1
- 民族主义
- 2
- 码农翻身
- 2
- 数据密集型应用系统设计
- 2
- 自闭症
- 2
- 瘋狂世界
- 1
- 万物起源
- 1
- 码出高效:Java开发手册
- 4
- 做二休五
- 1
- 民主
- 2
- Java Web轻量级开发面试教程
- 1
- 海盗经济学
- 3
- 法医的眼泪
- 1
- 生活中的经济学
- 2
- 纪录片
- 5
- 数字游戏
- 3
- 程序员面试金典(第5版)
- 2
- 上一堂最好玩的日本学
- 1
- Java程序员成功面试秘籍
- 15
- 程序员面试手册
- 2
- Spring 3.x企业应用开发实战
- 3
- Spring+MyBatis企业应用实战
- 12
- 扫地出门
- 10
- 数据结构与算法经典问题解析
- 2
- 深入分析Java Web技术内幕
- 3
- 东京酷玩之旅
- 1
- 日本.铁道旅行途中
- 1
- Java程序性能优化
- 8
- 宅人的东京
- 1
- Spring实战(第4版)
- 4
- Spring实战(第3版)
- 1
- Java Persistence with MyBatis 3
- 1
- Effective java 中文版(第2版)
- 15
- 疯狂Java讲义
- 13
- 銀座媽媽桑教的,男人就是吃這套!
- 1
- Java Web技术及应用
- 1
- 塑造世界经济的50项伟大发明
- 1
- Java 8实战
- 2
- MySQL技术内幕
- 1
- 吴琼琼的彩妆教室
- 1
- 风格感觉
- 1
- 明解Java
- 3
- 无神论
- 8
- 經濟學A-Z速查指南
- 6
- 高手
- 1
- 经济学语境下的法律规则
- 4
- 精通Git(第2版)
- 3
- 千年金融史
- 1
- 创造性破坏
- 10
- 移动的帝国
- 4
- 搭地铁游曼谷(第3版)
- 1
- 乡下人的悲歌
- 3
- 如何有效阅读一本书
- 1
- co-Trip小游趣:东京
- 1
- 这就是日本
- 8
- 东京攻略完全制霸(第5版)
- 1
- 算法图解
- 14
- HTTP/2基础教程
- 2
- 政治是什么?
- 19
- 为什么有的国家富裕,有的国家贫穷
- 1
- 认识管理(第4版)
- 4
- Web应用安全权威指南
- 22
- 图解基础设施设计模式
- 4
- PHP7内核剖析
- 2
- 经济学的思维方式(原书第13版)
- 2
- 图解Java多线程设计模式
- 1
- 经营战略全史
- 4
- 图解密码技术
- 10
- 图解TCP/IP (第5版)
- 5
- 斯坦福极简经济学
- 1
- 图解HTTP
- 5
- 经济学通识课
- 2
- Web应变之道
- 1
- SQL进阶教程
- 5
- SQL基础教程
- 9
- 技术之瞳——阿里巴巴技术笔试心得
- 2
- 深入理解ES6
- 11
- 文案创作完全手册
- 2
- 收获,不止SQL优化
- 8
- 卧底经济学4
- 7
- 知识分子与社会
- 1
- Pretty Good Number One
- 13
- 网络是怎样连接的
- 5
- 图解设计模式
- 1
- JavaScript权威指南(第6版)
- 1
- JavaScript高级程序设计(第3版)
- 2
- Web性能权威指南
- 6
- JavaScript模式
- 7
- 高性能网站建设进阶指南
- 12
- AV男優Q&A
- 1
- 黑客攻防技术宝典(第2版)
- 11
- 程序员面试攻略(原书第3版)
- 1
- jQuery基础教程(第3版)
- 5
- jQuery 技术内幕
- 1
- 李安哲学
- 1
- 编写高质量代码
- 1
- HTML5数据推送应用开发
- 2
- 酷玩经济学
- 10
- JavaScript忍者秘籍
- 6
- Ruby on Rails Tutorial
- 5
- Modern PHP(中文版)
- 1
- Web前端黑客技术揭秘
- 5
- 性存在
- 5
- 好色
- 1
- MongoDB权威指南
- 4
- 谜男启示录
- 2
- 賣淫的倫理學探究
- 2
- 嗨翻C语言
- 1
- 艺术的疗效
- 1
- 高效能程序员的修炼
- 2
- 独裁者手册
- 2
- 我的涼山兄弟
- 2
- 哈利·波特的哲学世界
- 4
- 如何高效学习
- 3
- 无聊的魅力
- 2
- Web之困:现代Web应用安全指南
- 1
- 程序员的思维修炼
- 1
- 苦水音乐
- 1
- 大转变
- 1
- 《生活大爆炸》粉丝升级手册
- 3
- 像经济学家一样思考
- 1
- 打工女孩
- 3
- 经济学常识
- 1
- 美国底层生存方式揭秘
- 1
- 时尚的哲学
- 1
- 被掩盖的经济真相
- 2
- 读人
- 4
- 平壤水族馆
- 1
- 人生的意义
- 3
- 浪潮之巅
- 15
- 论剽窃
- 1
- 你以为你以为的就是你以为的吗?2
- 5
- 加图决策者手册
- 4
- 不要讓床冷掉
- 2
- 社会主义
- 1
- 足球经济学
- 14
- 享受吧!一個人的SEX
- 1
- 快感
- 2
- 漫步华尔街
- 4
- 一件T恤的全球经济之旅
- 4
- 一切皆有价
- 6
- 白老虎
- 3
- 市场经济:大师们的思考
- 23
- 写给无神论者
- 3
- 理性乐观派
- 10
- 怪诞行为学
- 5
- 为什么常识会撒谎
- 2
- 价格理论及其应用
- 9
- 被捆绑的欲望
- 2
- 反对爱情
- 5
- 百辩经济学
- 8
- 诡辩与真相
- 57
- 亲爱的卧底经济学家
- 4
- 头条新闻背后的哲学
- 1
- 社会学与生活
- 1
- 把妹達人之誘惑藝術
- 3