合併菜品變成菜品組

2021-09-26 15:36:18 字數 3977 閱讀 3645

這道題是我朋友問的,而我只是自己寫的案例,所以格式什麼的都是自己定義的。

問題:現在前端詢問,給了個時間段,比如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 的材料。因為每次我們可以把最小的那個取走,不夠再從大於 ...