這道題是我朋友問的,而我只是自己寫的案例,所以格式什麼的都是自己定義的。
問題:現在前端詢問,給了個時間段,比如2019-01-01至2019-08-01,你查詢出來了這段時間使用到的菜品,放置到了乙個list中,使用node物件表示,start代表菜品開始時間,end代表菜品結束時間,name代表菜品的名稱
你需要返回乙個物件列表,使用物件ans表示,start表示開始時間,end表示結束時間,names表示這段時間內的菜品列表
例子:入參:start:2019-08-01,end:2019-08-31,list:,,,}
返回:},
},},
},}}
這道題的第一反應就是,時間段內,每天都判斷,然後把names一致的日期接近的進行合併,我也補充了**a。
然後就有個考慮,這就是兩個for迴圈啊,如果菜品和日期範圍都比較大的情況下,這種方法的**效率比較低
這時候就想到之前寫過的演算法題,可以使用乙個陣列也好,list也好來儲存菜品名字,只需要看變化就行啊,而每天是否變化,我可以使用map進行儲存,當菜品增減的時候,放到map中,key值就算對應的日期
而哪一天變化,也可以放到list中,這樣就不需要每天都判斷了(但是日期list需要排序)
**b就只是把變化使用map進行儲存,**c把變化的日期也放到list中了
附錄:這道題是朋友給我的,我寫完之後給了她,她給了她的架構師看的,一眼就看出了瑕疵以及需要改進的地方(比如,因為菜品過期需要remove,所以set比list就好用些),架構師就是厲害啊
為了讓**可閱讀性強,我也多加些注釋吧
因為是自己寫的例子,所以時間就沒有使用date型別,而是使用int了
入參node類
class node
出參ans類
class ans
}
**a:
//因為所有的變化是當天,所以上一條的結束時間是當天-1
private static listgethh3(listlist, int start, int end)
}listres = new arraylist();
for (int i = start + 1; i <= end; i++)
}if (!names.tostring().equals(namestemp.tostring()))
}//把最後的狀態也記錄一下
res.add(new ans(st, end, names));
return res;
}
**b:
private static listgethh2(listlist, int start, int end)
//起始時間早也沒用
if (node.start < start)
//結束時間晚也沒用
if (node.end > end)
liststartlist = startmap.get(node.start);
if (startlist == null)
startlist.add(node.name);
//禁用是結束時間的次日,所以要+1
listendlist = endmap.get(node.end + 1);
if (endlist == null)
endlist.add(node.name);
}setnames = new hashset<>();
listres = new arraylist();
//把start時間段的names記錄
if (startmap.containskey(start))
for (int i = start + 1; i <= end; i++)
//改變了,儲存到res中
res.add(new ans(start, i - 1, names));
if (endmap.containskey(i))
start = i;
if (startmap.containskey(i))
}//最後的資料了,儲存
res.add(new ans(start, end, names));
return res;
}
**c:
private static listgethh(listlist, int start, int end)
//起始時間早也沒用
if (node.start < start)
//結束時間晚也沒用
if (node.end > end)
//set記錄儲存的日期
set.add(node.start);
liststartlist = startmap.get(node.start);
if (startlist == null)
startlist.add(node.name);
set.add(node.end + 1);
//禁用是結束時間的次日,所以要+1
listendlist = endmap.get(node.end + 1);
if (endlist == null)
endlist.add(node.name);
}listkeylist = new arraylist(set);
//變化時間需要排序
keylist.sort(new comparator()
});setnames = new hashset<>();
int time = keylist.get(0);
//記錄起始
if (startmap.containskey(time))
for (int i = 1; i < keylist.size(); i++)
start = time;
if (startmap.containskey(time))
}if (keylist.get(keylist.size() - 1) != end + 1)
return res;
}
如果需要,測試的main方法
public static void main(string args)
system.out.println(system.currenttimemillis());
listans = gethh2(list, 0, 360);
system.out.println(system.currenttimemillis());
listans2 = gethh(list, 0, 360);
system.out.println(system.currenttimemillis());
listans3 = gethh3(list, 0, 360);
system.out.println(system.currenttimemillis());
system.out.println(ans.size());
system.out.println(ans2.size());
system.out.println(ans3.size());
system.out.println("----");
int num = 0;
for (ans a : ans)
system.out.println("----");
system.out.println(num);
num = 0;
for (ans a : ans2)
system.out.println("----");
system.out.println(num);
num = 0;
for (ans a : ans3)
system.out.println(num);
}
React菜品詳情檢視
ps 菜詳情頁與菜列表頁的思路比較相似的 首先安裝axios,在src目錄下的package.js檔案可以看到安裝完成的axios 然後就是呼叫api介面,在呼叫成功後的函式中設定資料來源,詳細頁是根據菜列表頁的 id來獲取對應的資料。示例中的變數id用來儲存通過路由傳過來的id,最後在渲染前的生命...
python練習 菜品統計
1 統計最火的菜品是什麼?而且這個最火的菜品總共出現了多少次?dishes name 該列為菜品的名字 2 白飯 大碗 不算菜 3 刪除全部為空的列 4 新的df寫入檔案 imp encoding utf 8 import pandas as pd 讀檔案 detail pd.read excel ...
3342 NOI2020 製作菜品
題目鏈結 考場上想到 70pts,結果沒清空 沒特判轉移 丟掉 35pts 不那麼顯然,如果 m ge n 1 那麼一定有解。考慮如果只剩下一堆大於 k 的材料,那麼每次我們取乙個,不夠再取另乙個,一定能取完。於是我們只用考慮怎麼消滅小於 k 的材料。因為每次我們可以把最小的那個取走,不夠再從大於 ...