对《培養與鍛鍊程式設計的邏輯腦(第二版)》的笔记(2)

培養與鍛鍊程式設計的邏輯腦(第二版)
  • 书名: 培養與鍛鍊程式設計的邏輯腦(第二版)
  • 作者: 江任捷
  • 出版社: 博碩文化
  • 出版年: 2016-2-5
  • Chapter 1 遞增法 Incremental Method

    利用一個變數,暫存其中一個數字,以便對調。

    1. void swap_int()
    2. {
    3. int a=0,b=1;
    4. //交換a與b
    5. int temp=a;
    6. a=b;
    7. b=temp;
    8. cout<<a<<''<<b;
    9. }

    1. void swap_int(int&a,int&b)
    2. {
    3. int temp=a;
    4. a=b;
    5. b=temp;
    6. }
    2018-08-18 23:49:47 回应
  • Chapter 3 枚舉法 Enumerative Method

    範例:平面上距離最近的兩個點( Closest Pair )

    第一層枚舉第一個點,第二層枚舉第二個點。為了避免重複枚舉相同的一對點,第二層只枚舉索引值更高的點。

    1. void closest_pair()
    2. {
    3. float point[10][2]=
    4. {
    5. {3,3},{1,5},{4,6},{2,8},{9,9},
    6. {2,1},{7,2},{6,5},{9,4},{5,9}
    7. };
    8. //距離最近的兩個點的距離
    9. float d=1e9;
    10. //枚舉第一點
    11. for(int i=0;i<10;i++)
    12. //枚舉第二點
    13. for(int j=i+1;j<10;j++)
    14. {
    15. //計算第一點到第二點的距離
    16. float dx=point[i][0]-point[j][0];
    17. float dy=point[i][1]-point[j][1];
    18. float dij=sqrt(dx*dx+dy*dy);
    19. //記錄最短的距離
    20. if(dij<d)d=dij;
    21. }
    22. cout<<"距離是"<<d;
    23. }

    可以把計算距離的程式碼,抽離出來成為一個函式。好處是程式碼變得清爽許多,增加程式碼可讀性。壞處是大量呼叫函式,導致執行速度變慢。

    1. struct Point{float x,y;};
    2. //計算兩點之間的距離
    3. float dist(Point a,Point b)
    4. {
    5. float dx=a.x-b.x;
    6. float dy=a.y-b.y;
    7. return sqrt(dx*dx+dy*dy);
    8. }
    9. void closest_pair()
    10. {
    11. Point point[10]=
    12. {
    13. {3,3},{1,5},{4,6},{2,8},{9,9},
    14. {2,1},{7,2},{6,5},{9,4},{5,9}
    15. };
    16. float d=1e9;
    17. for(int i=0;i<10;i++)
    18. for(int j=i+1;j<10;j++)
    19. //記錄最短的距離
    20. d=min(d,dist(point[i],point[j]));
    21. cout<<"距離是"<<d;
    22. }

    魚與熊掌不可兼得,這兩種程式碼各有優缺點,沒有絕對的好壞。程式員必須自行取捨。

    範例:反轉字串

    兩個枚舉,一個從頭到尾,一個從尾到頭,步調相同,逐步對調字元。雖然是兩個枚舉,卻只有一個迴圈。

    1. void reverse_string()
    2. {
    3. char s[15]="HelloWorld!";
    4. //兩個枚舉,一個從頭到尾,一個從尾到頭。
    5. for(int i=0,j=12;i<j;i++,j--)
    6. swap(s[i],s[j]);
    7. cout<<"反轉之後的字串是"<<s;
    8. }

    1. void reverse(char*s)
    2. {
    3. int n=strlen(s);
    4. for(int i=0;i<n/2;i++)
    5. swap(s[i],s[n-1-i]);
    6. }

    範例:尋找總和為 10 的區間

    假設陣列元素只有正數。

    兩個枚舉,枚舉區間左端以及枚舉區間右端,都是從頭到尾,保持一左一右,視情況輪流枚舉。雖然是兩個枚舉,卻只有一個迴圈。

    1. void find_interval()
    2. {
    3. int array[5]={3,6,1,7,2};
    4. int sum=0;
    5. for(int i=0,j=-1;j<5;)//枚舉區間[i,j]
    6. {
    7. if(sum>10)
    8. {
    9. //總和太大,區間左端往右縮短。
    10. sum-=array[i];
    11. i++;
    12. }
    13. else if(sum<10)
    14. {
    15. //總和太小,區間右端往右伸長。
    16. j++;
    17. sum+=array[j];
    18. }
    19. else if(sum==10)
    20. {
    21. //總和剛好,
    22. //區間左端往右縮短,
    23. //亦得區間右端往右伸長。
    24. //任選一種皆可。
    25. //sum-=array[i];
    26. //i++;
    27. j++;
    28. sum+=array[j];
    29. }
    30. if(sum==10)
    31. cout<<'['<<i<<','<<j<<']';
    32. }
    33. }

    1. void find_interval(int array[],int n,int num)
    2. {
    3. int sum=0;
    4. for(int i=0,j=0;j<=n;)//枚舉區間[i,j)
    5. {
    6. if(sum>num)
    7. sum-=array[i++];
    8. else
    9. sum+=array[j++];
    10. if(sum==num)
    11. cout<<'['<<i<<','<<j-1<<']';
    12. }
    13. }

    讀者可以想想看:陣列元素若有零、有負數,是否要調整枚舉方式?

    範例:尋找陣列之中的特定數字,陣列已經由小到大排序

    找到其中一個特定數字:首先找到陣列中央的數字,依其數字大小,繼續搜尋左半段或者右半段。

    1. void find_number()
    2. {
    3. int array[15]=
    4. {
    5. 2,3,5,7,11,
    6. 13,17,19,23,29,
    7. 31,37,41,43,47
    8. };
    9. int left=0,right=15-1;
    10. while(left<=right)
    11. {
    12. int mid=(left+right)/2;
    13. if(array[mid]<29)
    14. left=mid+1;//繼續搜尋剩下的右半段
    15. else if(array[mid]>29)
    16. right=mid-1;//繼續搜尋剩下的左半段
    17. else if(array[mid]==29)
    18. {
    19. //找到了其中一個數字
    20. cout<<mid<<':'<<array[mid];
    21. return;
    22. }
    23. }
    24. cout<<"找不到29";
    25. }

    找到所有特定數字:讀者請自行嘗試。

    2018-08-19 00:30:43 回应

的其他笔记  · · · · · ·  ( 全部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