พูดคุยกันว่าทำไมฉันถึงเขียนเรื่องนี้ครั้งแรก เมื่อฉันไปสัมภาษณ์ฉันไปที่เมืองสัมภาษณ์ที่ได้รับมอบหมายของอาลีบาบาเวลา 11 นาฬิกาก่อนการสัมภาษณ์และฉันพบโรงแรมและพักที่ประมาณ 1 นาฬิกานอกจากนี้ฉันยังนอนไม่หลับตอนกลางคืน ซึ่งนำไปสู่ผลการสัมภาษณ์ที่น่าสงสารโดยตรงในวันถัดไป (สำหรับกุ้งใหญ่ที่กำลังมองหางานไม่ควรพูดถึงโศกนาฏกรรมของกุ้งมันยังเป็นสิ่งสำคัญมากที่จะเตรียมตัวล่วงหน้า) หนึ่งชั่วโมง (เมื่อฉันกลับมาจากการสัมภาษณ์ฉันเกือบจะหลับเมื่อฉันเดินเศร้า !!) เมื่อการสัมภาษณ์สิ้นสุดลงผู้สัมภาษณ์ถามฉันเกี่ยวกับลำดับ Fibonacci ในเวลานั้น และฉันรู้เพียงว่าฉันต้องตั้งค่าตัวแปรสามตัวหรือเริ่มต้นด้วยรายการ ท้ายที่สุดฉันสามารถเขียนวิธีการแรกต่อไปนี้ภายใต้การเหนี่ยวนำโดยทีละขั้นตอนของผู้สัมภาษณ์ ยุคทองสำหรับการปฏิรูปและการขุดทองคำ (คุณสามารถไปได้อย่างรวดเร็วหากคุณมีความสามารถ) ด้วยขยะสำหรับการวิเคราะห์ข้อมูล Alibaba สามารถวิเคราะห์ข้อมูลรายละเอียดของผู้ใช้ที่หลากหลายที่มีความเชี่ยวชาญและสามารถค้นหารสนิยมและความต้องการของผู้ใช้ได้ดีขึ้นทำให้ดีขึ้นสำหรับการผลักดันการโฆษณาที่แม่นยำและการโฆษณาที่แม่นยำ หากความฝันในอนาคตของ Tencent คือการเป็นน้ำไฟฟ้าและก๊าซในชีวิตของผู้ใช้ความฝันในอนาคตที่เป็นไปได้ของอาลีบาบาคืออาหารเสื้อผ้าที่อยู่อาศัยและการขนส่งของผู้ใช้และน้ำไฟฟ้าและก๊าซ ฯลฯ O (∩_∩) O ~ มาหันไปใช้หัวข้อกันเถอะ
สำหรับนักออกแบบอัลกอริทึมที่ยอดเยี่ยมมีเพียงสองสิ่งเท่านั้นที่จะสนใจบนพื้นฐานของการใช้งานของโปรแกรมฟังก์ชั่นโปรแกรม: หนึ่งคือความซับซ้อนของเวลาของอัลกอริทึมการออกแบบและอื่น ๆ คือความซับซ้อนของพื้นที่ เวลาและหน่วยความจำที่ใช้ในการดำเนินการโปรแกรมและจำนวนหน่วยความจำที่ถูกครอบครองโดยพื้นที่); ข้อกำหนดโดยทั่วไปการแลกเปลี่ยนทรัพยากรพื้นที่สำหรับเวลาหรือวัตถุที่ใช้กันทั่วไปมักจะอยู่ในหน่วยความจำเพื่อปรับปรุงเวลาตอบสนอง (เทคโนโลยีการแคชและฐานข้อมูล NOSQL ที่ได้รับความนิยมมากที่สุดส่วนใหญ่ใช้) สำหรับระบบฝังตัว
มาพูดคุยกันเกี่ยวกับการใช้งานทั้งสามของซีรีย์ Febonasi
ก่อนอื่นมาพูดถึงลำดับ Febonasi:
จากมุมมองที่เป็นข้อความลำดับ Fibonacci เริ่มต้นด้วย 0 และ 1 และค่าสัมประสิทธิ์ Fibonacci ที่ตามมาจะถูกเพิ่มโดยตัวเลขสองตัวก่อนหน้านี้และแบบฟอร์มลำดับมีดังนี้:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, …………………
ในวิชาคณิตศาสตร์มันถูกกำหนดโดยวิธีการเรียกซ้ำ:
f_0 = 0
f_1 = 1
f_n = f_ {n-1}+ f_ {n-2}
ใช้ข้อกำหนด: ป้อนหมายเลขซีเรียล N และกลับมาเพื่อรับหมายเลข FENACCI ที่เกี่ยวข้อง
การใช้งานโปรแกรม 1 - ฟังก์ชั่นตนเอง
การคัดลอกรหัสมีดังนี้:
-
* ฟังก์ชั่นการใช้งานด้วยตนเอง
* @title: fntype1
* @description: todo
* @param @param n
* @param @return
* @return int
* @throws ยกเว้น
-
สาธารณะ int fntype1 (int n) โยนข้อยกเว้น {
ถ้า (n == 0) {
กลับ 0;
} อื่นถ้า (n == 1 || n == 2) {
กลับ 1;
} อื่นถ้า (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
ถ้า (อุณหภูมิ <0) {
โยนข้อยกเว้นใหม่ ("ค่าไม่ถูกต้องสำหรับประเภท int, ใหญ่เกินไป");
}อื่น{
กลับอุณหภูมิ;
-
}อื่น{
โยนข้อยกเว้นใหม่ ("ค่าผิดกฎหมายสำหรับ n โปรดป้อน n> = 0");
-
-
ข้อเสียของวิธีนี้: การวนซ้ำจำนวนมากใช้พื้นที่สแต็กอย่างต่อเนื่อง (ผู้ที่มีส่วนร่วมในการพัฒนาเว็บการดีบักและการบำรุงรักษาควรรู้คุณค่าของทรัพยากรสแต็กเซิร์ฟเวอร์หากมีการเรียกซ้ำหลายครั้ง เป็นเวลานานทำให้เกิดความผิดพลาดในเว็บเซิร์ฟเวอร์) เกิดขึ้นและการดีบักเป็นเรื่องยาก
การใช้งานโปรแกรม 2 - Time to Space
การคัดลอกรหัสมีดังนี้:
-
* ถึงเวลาเปลี่ยนพื้นที่
* @title: fntype2
* @description: todo
* @param @param n
* @param @return
* @return int (n <0 return -1, เกินขนาด int max return -2)
* @throws
-
สาธารณะ int fntype2 (int n) {
int result = -1;
int temp1 = 0;
int temp2 = 1;
สำหรับ (int index = 0; index <= n; index ++) {
if (index == 0) {
ผลลัพธ์ = temp1;
} อื่นถ้า (index == 1) {
ผลลัพธ์ = temp2;
}อื่น{
ผลลัพธ์ = temp1+temp2;
ถ้า (ผลลัพธ์ <0) {
ผลลัพธ์ = -2;
หยุดพัก;
-
temp1 = temp2;
temp2 = ผลลัพธ์;
-
-
ผลการกลับมา;
-
วิธีการนี้ส่วนใหญ่ใช้ใน: สถานการณ์ที่ 1: สำหรับสถานการณ์ที่วัตถุหรือตัวแปรถูกใช้น้อยกว่าและจะไม่ถูกใช้อีกครั้งหลังการใช้งานครั้งเดียว . วิธีนี้มักใช้ในการออกแบบ
การใช้งานโปรแกรม 3 - พื้นที่สำหรับเวลา
การคัดลอกรหัสมีดังนี้:
รายการคงที่ส่วนตัว <integer> fndata = new ArrayList <จำนวนเต็ม> ();
INT MAXSIZE สุดท้ายคงที่ = 50000;
-
* Initializer
* @title: setfndata
* @description: todo
* @param
* @return เป็นโมฆะ
* @throws
-
โมฆะคงที่ส่วนตัว setfndata () {
int result = -1;
int temp1 = 0;
int temp2 = 1;
สำหรับ (int index = 0; index <= maxsize; index ++) {
if (index == 0) {
ผลลัพธ์ = temp1;
} อื่นถ้า (index == 1) {
ผลลัพธ์ = temp2;
}อื่น{
ผลลัพธ์ = temp1+temp2;
ถ้า (ผลลัพธ์ <0) {
ผลลัพธ์ = -2;
หยุดพัก;
-
temp1 = temp2;
temp2 = ผลลัพธ์;
-
fndata.add (ผลลัพธ์);
-
-
-
* อินเทอร์เฟซภายนอก
* @title: getfndata
* @description: todo
* @param @param n
* @param @return
* @return int <span style = "font-family: sans-serif;"> (n เกิน fndata.size () และ n <0 return -1) </span>
* @throws
-
สาธารณะ int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
-
if (fndata.size ()> n && n> = 0) {
ส่งคืน fndata.get (n);
}อื่น{
กลับ -1;
-
-
วิธีนี้ใช้โดยทั่วไปในสถานการณ์ที่วัตถุหรือตัวแปรมีอยู่หรือมักเรียกว่าตลอดวงจรชีวิตทั้งหมดของโปรแกรมเช่นการเรียกใช้อินเทอร์เฟซเว็บเซิร์ฟเวอร์ภายนอก, เลเยอร์การคงอยู่ของนามธรรม, การโหลดพารามิเตอร์การกำหนดค่าที่ใช้กันทั่วไป ฯลฯ
กรณีทดสอบ:
การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.dbc.yangg.swing.test;
นำเข้า java.util.arraylist;
นำเข้า java.util.list;
-
* ป้อนหมายเลขลำดับ n และกลับเพื่อรับหมายเลข febonacci ที่เกี่ยวข้อง
* @className: init
* @description: todo
* @author [email protected]
* @date 10 มกราคม 2014 เวลา 19:52:13 น
-
-
คลาสสาธารณะเริ่มต้น {
-
* ฟังก์ชั่นการใช้งานด้วยตนเอง
* @title: fntype1
* @description: todo
* @param @param n
* @param @return
* @return int
* @throws ยกเว้น
-
สาธารณะ int fntype1 (int n) โยนข้อยกเว้น {
ถ้า (n == 0) {
กลับ 0;
} อื่นถ้า (n == 1 || n == 2) {
กลับ 1;
} อื่นถ้า (n> 2) {
int temp = fntype1 (n-1)+fntype1 (n-2);
ถ้า (อุณหภูมิ <0) {
โยนข้อยกเว้นใหม่ ("ค่าไม่ถูกต้องสำหรับประเภท int, ใหญ่เกินไป");
}อื่น{
กลับอุณหภูมิ;
-
}อื่น{
โยนข้อยกเว้นใหม่ ("ค่าผิดกฎหมายสำหรับ n โปรดป้อน n> = 0");
-
-
-
* ถึงเวลาเปลี่ยนพื้นที่
* @title: fntype2
* @description: todo
* @param @param n
* @param @return
* @return int (n <0 return -1, เกินขนาด int max return -2)
* @throws
-
สาธารณะ int fntype2 (int n) {
int result = -1;
int temp1 = 0;
int temp2 = 1;
สำหรับ (int index = 0; index <= n; index ++) {
if (index == 0) {
ผลลัพธ์ = temp1;
} อื่นถ้า (index == 1) {
ผลลัพธ์ = temp2;
}อื่น{
ผลลัพธ์ = temp1+temp2;
ถ้า (ผลลัพธ์ <0) {
ผลลัพธ์ = -2;
หยุดพัก;
-
temp1 = temp2;
temp2 = ผลลัพธ์;
-
-
ผลการกลับมา;
-
รายการคงที่ส่วนตัว <integer> fndata = new ArrayList <จำนวนเต็ม> ();
INT MAXSIZE สุดท้ายคงที่ = 50000;
-
* พื้นที่ในการเปลี่ยนเวลา
* @title: setfndata
* @description: todo
* @param
* @return เป็นโมฆะ
* @throws
-
โมฆะคงที่ส่วนตัว setfndata () {
int result = -1;
int temp1 = 0;
int temp2 = 1;
สำหรับ (int index = 0; index <= maxsize; index ++) {
if (index == 0) {
ผลลัพธ์ = temp1;
} อื่นถ้า (index == 1) {
ผลลัพธ์ = temp2;
}อื่น{
ผลลัพธ์ = temp1+temp2;
ถ้า (ผลลัพธ์ <0) {
ผลลัพธ์ = -2;
หยุดพัก;
-
temp1 = temp2;
temp2 = ผลลัพธ์;
-
fndata.add (ผลลัพธ์);
-
-
-
-
* @title: getfndata
* @description: todo
* @param @param n
* @param @return
* @return int (n เกิน fndata.size () และ n <0 return -1)
* @throws
-
สาธารณะ int getfndata (int n) {
if (fndata.size () == 0) {
setfndata ();
-
if (fndata.size ()> n && n> = 0) {
ส่งคืน fndata.get (n);
}อื่น{
กลับ -1;
-
-
-
-
* @title: หลัก
* @description: todo
* @param @param argv
* @return เป็นโมฆะ
* @throws
-
โมฆะคงที่สาธารณะหลัก (สตริง [] argv) {
init init = new init ();
int n = 46;
พยายาม {
System.out.println ("type1 ="+init.fntype1 (n));
} catch (Exception e) {
// todo catch block ที่สร้างอัตโนมัติ
System.out.println (e.getMessage ());
-
System.out.println ("type2 ="+init.fntype2 (n));
System.out.println ("type3 ="+init.getfndata (n));
-
-
ผลลัพธ์ผลลัพธ์:
การคัดลอกรหัสมีดังนี้:
type1 = 1836311903
type2 = 1836311903
Type3 = 1836311903
เมื่อออกแบบอัลกอริทึมอย่าทำตามแนวคิดแบบสุ่มสี่สุ่มห้า
ให้ฉันบ่น: โดยส่วนตัวแล้วฉันเชื่อว่าการออกแบบโครงสร้างข้อมูลที่ยอดเยี่ยมสามารถทำให้ความซับซ้อนของการออกแบบอัลกอริทึมง่ายขึ้นและปรับปรุงความสามารถในการอ่านรหัสความสามารถในการปรับขนาดของโปรแกรมและประสิทธิภาพการดำเนินการ
ให้ฉันบ่นอีกครั้ง: ควรปฏิบัติตามหลักการสามประการเมื่อทำการวิเคราะห์ความต้องการ: 1. การวิเคราะห์จากมุมมองของผู้ใช้และวิธีคิด หลักการของการพัฒนาโปรแกรมคือ: ปรับปรุงรสนิยมของตัวเองอย่างแข็งขันและวิเคราะห์ฟังก์ชั่นจากมุมมองการใช้งานของผู้ใช้และสถานการณ์การใช้งาน IS และสถานการณ์ใดที่ผู้ใช้อยู่ในต่อไปนี้จะถูกเรียกว่าข้อยกเว้นใดที่อาจเกิดขึ้นจากพารามิเตอร์การส่งผ่านข้อยกเว้นใดที่อาจเกิดขึ้นในการใช้งานส่วนต่อประสานของคุณและจับข้อยกเว้นที่เป็นไปได้ จากนั้นคุณบนพื้นฐานของการสร้างความมั่นใจในการใช้งานธุรกิจคุณควรออกแบบ UI ในฐานะผู้ใช้ในแง่ของพฤติกรรมการใช้งานของผู้ใช้และด้านอื่น ๆ มันน่าสนใจมากใช่ไหมถ้าคุณมีข้อกำหนดและการพัฒนามากเกินไปคุณจะเข้าใจ O (∩_∩) O ~