在實際編寫代碼處理問題時,發現對數組對象的處理還是很陌生,在這裏記錄一下使用方法。
編寫背景及參考代碼
交易金額超過 ¥1000
或者,它和另一個城市中同名的另一筆交易相隔不超過 60 分鐘(包含 60 分鐘整)
每個交易字符串 transactions[i] 由一些用逗號分隔的值組成,這些值分別表示交易的名稱,時間(以分鐘計),金額以及城市。
給你一份交易清單 transactions,返回可能無效的交易列表。你可以按任何順序返回答案。
示例 1:
輸入:transactions = [“alice,20,800,mtv”,“alice,50,100,beijing”]
輸出:[“alice,20,800,mtv”,“alice,50,100,beijing”]
解釋:第一筆交易是無效的,因爲第二筆交易和它間隔不超過 60 分鐘、名稱相同且發生在不同的城市。同樣,第二筆交易也是無效的。
示例 2:
輸入:transactions = [“alice,20,800,mtv”,“alice,50,1200,mtv”]
輸出:[“alice,50,1200,mtv”]
示例 3:
輸入:transactions = [“alice,20,800,mtv”,“bob,50,1200,mtv”]
輸出:[“bob,50,1200,mtv”]
提示:
transactions.length <= 1000
每筆交易 transactions[i] 按 “{name},{time},{amount},{city}” 的格式進行記錄
每個交易名稱 {name} 和城市 {city} 都由小寫英文字母組成,長度在 1 到 10 之間
每個交易時間 {time} 由一些數字組成,表示一個 0 到 1000 之間的整數
每筆交易金額 {amount} 由一些數字組成,表示一個 0 到 2000 之間的整數
解答:
var invalidTransactions = function (transactions) {
let invalid = new Set();
transactions.forEach((element, index) => { //將transactions轉成便於比較的二維數組
transactions[index] = element.split(",");
});
for (let i = 0; i < transactions.length; i++) { //兩層遍歷取符和結果的值
if (transactions[i][2] > 1000) {
invalid.add(transactions[i].join(","));
}
for (let j = i + 1; j < transactions.length; j++) {
if (transactions[j][0] === transactions[i][0]
&& Math.abs(transactions[i][1] - transactions[j][1]) <= 60
&& transactions[i][3] != transactions[j][3]) {
invalid.add(transactions[i].join(","));
invalid.add(transactions[j].join(","));
}
}
}
return [...invalid];
};
思考及學習
在我自己實際答題時,未注意將每個元素進行二維數組分割這樣一個操作,默認成了數組對象的組成方式:
transactions:[
{
id:1,
name:"alice",
amount:800,
time:20,
city:"mtv"
},
{
id:2,
name:"alice",
amount:100,
time:50,
city:"beijing"
}
]
因此在實際運行過程中一直無結果輸出。
set的使用
ES6 提供了新的數據結構 Set。它類似於數組,但是成員的值都是唯一的,沒有重複的值。這也省去了本題中,需要去除重複的需求。
代碼示例:
const s = new Set();
[2,3,5,4,5,2,2].forEach(x => s.add(x));
// Set結構不會添加重複的值
for(let i of s) {
console.log(i);
}
打印結果:
將本題的字符輸入進行測試
set中每一個值都不會重複,但是,爲何在本題“前端小隊長”寫的那串代碼輸出的時候,可以做到顯示的是["alice,20,800,mtv", "alice,50,100,beijing"]
,這裏就要提及數組處理方法split和join了
join使數組變字符串
let ListBefore=["1","2","3","4"];
joinList = ListBefore.join(",");
console.log(joinList);
輸出結果:
split使字符串變數組
strToList=joinList.split(",")
//輸出結果 (4) ["1", "2", "3", "4"]
可以通過兩個變量的值看出這一轉換過程
分析時發現,將字符串數組進行拆分,變成二維數組的方法竟然是這樣,emmm,js的語法還是要好好地看一看
transactions.forEach((element, index) => { //將transactions轉成便於比較的二維數組
transactions[index] = element.split(",");
});
附解決方案參考來源:
CSDN博主「前端小端長」
原文鏈接:https://blog.csdn.net/zhang1339435196/article/details/101440416
題目來源:
力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/invalid-transactions
這裏是我在看到“前端小隊長”的寫法前隨意寫的解法。
因爲不知道data的渲染需要在函數最後加 THIS 琢磨了好久都沒有結果。還好及時請教了小夥伴
this.test=result
這裏是我拙劣的解答
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>測試</title>
<style>
[v-cloak]{
display:none;
}
*{
padding:0;
margin:0;
list-style:none;
}
.container{
width:90%;
margin:10px auto;
line-height: 20px;
}
.thead-ul
{
display: flex;
border:1px solid burlywood;
padding: 10px;
color:burlywood;
}
.thead-ul li
{
flex:1;
text-align:center;
align-items: center;
padding:20px ;
}
</style>
</head>
<body>
<div id="app" v-cloak>
<div class="container">
<span>輸入</span>
<!-- <input type="text" :value="test"> -->
<ul class="thead-ul">
<li>name</li>
<li>time</li>
<li>amount</li>
<li>city</li>
</ul>
<ul class="thead-ul" v-for="item in transactions">
<li>{{item.name}}</li>
<li>{{item.time}}</li>
<li>{{item.amount}}</li>
<li>{{item.city}}</li>
</ul>
<span>輸出</span>
<button @click="invalidTransactions(transactions,test)">函數調用</button>
<div style="height:100px;border:1px solid burlywood">
<ul class="thead-ul" v-for="item in test">
<li>{{item.name}}</li>
<li>{{item.time}}</li>
<li>{{item.amount}}</li>
<li>{{item.city}}</li>
</ul>
</div>
</div>
</div>
<script src="https://cdn.bootcss.com/vue/2.6.10/vue.js"></script>
<script>
Vue.config.devtools = false
Vue.config.productionTip = false
new Vue({
el:"#app",
methods: {
invalidTransactions(transactions,test){
let result=[];
var keys;
var j;
var i;
for (var j=0;j< transactions.length;j++)
{
keys= transactions[j];
if (keys.amount>1000)
{
if(result.length==0){
result.push(keys)
}else{
let flag=0
for (let m=0;m<result.length;m++)
{
if(keys.id==result.id){flag=1;break}
}
if(flag==0){result.push(keys)}
}
}
for(i=j+1;i<transactions.length;i++ )
{
if(keys.name==transactions[i].name && keys.city!=transactions[i].city && Math.abs(keys.time-transactions[i].time)<=60)
{
if(result.length==0){
result.push(keys)
result.push(transactions[i])
}else{
let flag1=0
let flag2=0
for (let m=0;m<result.length;m++)
{
if(keys.id==result.id){flag1=1;break}
if(transactions[i].id==result.id){flag2=1;break}
}
if(flag1==0){result.push(keys)}
if(flag2==0){result.push(keys)}
}
}
}
}
this.test=result
}
},
data() {
return {
transactions:[
{
id:1,
name:"alice",
amount:800,
time:20,
city:"mtv"
},
{
id:2,
name:"alice",
amount:100,
time:50,
city:"beijing"
}
],
test:[]
}
}
})
</script>
</body>
</html>