1169-查询无效交易

Raphael Liu Lv10

如果出现下述两种情况,交易 可能无效

  • 交易金额超过 1000
  • 或者,它和 另一个城市同名 的另一笔交易相隔不超过 60 分钟(包含 60 分钟整)

给定字符串数组交易清单 transaction 。每个交易字符串 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} 都由小写英文字母组成,长度在 110 之间
  • 每个交易时间 {time} 由一些数字组成,表示一个 01000 之间的整数
  • 每笔交易金额 {amount} 由一些数字组成,表示一个 02000 之间的整数

解题思路

1.找无效的,交易金额超过 1000 就无效;或者,它和 另一个城市 中 同名 的另一笔交易相隔不超过 60 分钟(包含 60 分钟整)
2.第二种情况是 相互无效
3.两笔交易符合第二种情况 那同时第二笔交易超过 1000,那第一笔交易算有问题吗? //先假设第二种情况是优先的
4.这种还是放到二维数组里 然后排序。二维数组要多建一列 把有问题的置为1,允许重复置1
5.遍历同时看 是不是超过1000,超过1000置1
6.二维数组 排序。同名的要全部判断,那排序 只按照名字排序就行
7.冒泡 第一层for是遍历二维数组,第二层for 先看是不是同名 再看是不是异地的 再看是不是时间不超过60分钟 都是的话 两个都置1;不是同名就break这层for
8.冒泡 只对后面进行判断, 有问题两个都置1
9.擦 又有字符串 又有数字,得放字符串得二维数组里了,不过字符串数组也能排序
10.还要一列 记录原字符串 方便加到返回结果里。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution {
public List<String> invalidTransactions(String[] transactions) {
int len = transactions.length;
String[][] arr = new String[len][6];

for (int i = 0; i < len; i++) {
String[] sp = transactions[i].split(",");
arr[i][0] = sp[0]; //第0列是名字
arr[i][1] = sp[1]; //第1列是时间
arr[i][2] = sp[2]; //第2列是金额
arr[i][3] = sp[3]; //第3列是城市
if (Integer.parseInt(sp[2]) > 1000) arr[i][4] = "1"; //遍历同时看 是不是超过1000,超过1000置1。
arr[i][5] = transactions[i]; //第5列是原字符串 方便加到返回结果里。
}
Arrays.sort(arr, (o1, o2)-> o1[0].compareTo(o2[0])); //按第0列 升序排序 即同名的放一起

List<String> list = new ArrayList<>();
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (!arr[i][0].equals(arr[j][0])) break; //不是同名就break这层for
if (!arr[i][3].equals(arr[j][3])){
if (Math.abs(Integer.parseInt(arr[i][1]) - Integer.parseInt(arr[j][1])) <= 60){
arr[i][4] = "1";
arr[j][4] = "1";
}
}
}
if ("1".equals(arr[i][4])) list.add(arr[i][5]);
}

return list;
}
}
 Comments
On this page
1169-查询无效交易