[Swift]LeetCode831. 隱藏我的信息 | Masking Personal Information

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址: http://www.javashuo.com/article/p-vdysskmd-me.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

We are given a personal information string S, which may represent either an email address or a phone number.git

We would like to mask this personal information according to the following rules:github


1. Email address:數組

We define a name to be a string of length ≥ 2consisting of only lowercase letters a-z or uppercase letters A-Z.微信

An email address starts with a name, followed by the symbol '@', followed by a name, followed by the dot '.' and followed by a name. app

All email addresses are guaranteed to be valid and in the format of "name1@name2.name3".ide

To mask an email, all names must be converted to lowercase and all letters between the first and last letter of the first name must be replaced by 5 asterisks '*'.函數


2. Phone number:this

A phone number is a string consisting of only the digits 0-9 or the characters from the set {'+', '-', '(', ')', ' '}. You may assume a phone number contains 10 to 13 digits.spa

The last 10 digits make up the local number, while the digits before those make up the country code. Note that the country code is optional. We want to expose only the last 4 digits and mask all other digits.

The local number should be formatted and masked as "***-***-1111", where 1 represents the exposed digits.

To mask a phone number with country code like "+111 111 111 1111", we write it in the form "+***-***-***-1111".  The '+' sign and the first '-' sign before the local number should only exist if there is a country code.  For example, a 12 digit phone number mask should start with "+**-".

Note that extraneous characters like "(", ")", " ", as well as extra dashes or plus signs not part of the above formatting scheme should be removed.

 

Return the correct "mask" of the information provided.

 

Example 1:

Input: "LeetCode@LeetCode.com"
Output: "l*****e@leetcode.com"
Explanation: All names are converted to lowercase, and the letters between the
             first and last letter of the first name is replaced by 5 asterisks.
             Therefore, "leetcode" -> "l*****e".

Example 2:

Input: "AB@qq.com"
Output: "a*****b@qq.com"
Explanation: There must be 5 asterisks between the first and last letter 
             of the first name "ab". Therefore, "ab" -> "a*****b".

Example 3:

Input: "1(234)567-890"
Output: "***-***-7890"
Explanation: 10 digits in the phone number, which means all digits make up the local number.

Example 4:

Input: "86-(10)12345678"
Output: "+**-***-***-5678"
Explanation: 12 digits, 2 digits for country code and 10 digits for local number. 

Notes:

  1. S.length <= 40.
  2. Emails have length at least 8.
  3. Phone numbers have length at least 10.

給你一條我的信息 string S,它多是一個郵箱地址,也多是一個電話號碼。

咱們將隱藏它的隱私信息,經過以下規則:

1. 電子郵箱

定義名稱 <name> 的長度大於2,而且只包含小寫字母 a-z 和大寫字母 A-Z。

電子郵箱地址由名稱 <name> 開頭,緊接着是符號 '@',後面接着一個名稱 <name>,再接着一個點號 '.',而後是一個名稱 <name>。

電子郵箱地址肯定爲有效的,而且格式是"name1@name2.name3"。

爲了隱藏電子郵箱,全部的名稱 <name> 必須被轉換成小寫的,而且第一個名稱 <name> 的第一個字母和最後一個字母的中間的全部字母由 5 個 '*' 代替。

2. 電話號碼

電話號碼是一串包括數組 0-9,以及 {'+', '-', '(', ')', ' '} 這幾個字符的字符串。你能夠假設電話號碼包含 10 到 13 個數字。

電話號碼的最後 10 個數字組成本地號碼,在這以前的數字組成國際號碼。注意,國際號碼是可選的。咱們只暴露最後 4 個數字並隱藏全部其餘數字。

本地號碼是有格式的,而且如 "***-***-1111" 這樣顯示,這裏的 1 表示暴露的數字。

爲了隱藏有國際號碼的電話號碼,像 "+111 111 111 1111",咱們以 "+***-***-***-1111" 的格式來顯示。在本地號碼前面的 '+' 號和第一個 '-' 號僅當電話號碼中包含國際號碼時存在。例如,一個 12 位的電話號碼應當以 "+**-" 開頭進行顯示。

注意:像 "(",")"," " 這樣的不相干的字符以及不符合上述格式的額外的減號或者加號都應當被刪除。

 

最後,將提供的信息正確隱藏後返回。

 

示例 1:

輸入: "LeetCode@LeetCode.com"
輸出: "l*****e@leetcode.com"
解釋: 
全部的名稱轉換成小寫, 第一個名稱的第一個字符和最後一個字符中間由 5 個星號代替。
所以,"leetcode" -> "l*****e"。

示例 2:

輸入: "AB@qq.com"
輸出: "a*****b@qq.com"
解釋: 
第一個名稱"ab"的第一個字符和最後一個字符的中間必須有 5 個星號
所以,"ab" -> "a*****b"。

示例 3:

輸入: "1(234)567-890"
輸出: "***-***-7890"
解釋: 
10 個數字的電話號碼,那意味着全部的數字都是本地號碼。

示例 4:

輸入: "86-(10)12345678"
輸出: "+**-***-***-5678"
解釋: 
12 位數字,2 個數字是國際號碼另外 10 個數字是本地號碼 。

注意:

  1. S.length <= 40
  2. 郵箱的長度至少是 8。
  3. 電話號碼的長度至少是 10。

Runtime: 8 ms
Memory Usage: 20.2 MB
 1 class Solution {
 2     var country:[String] = ["", "+*-", "+**-", "+***-"]
 3     func maskPII(_ S: String) -> String {
 4         var S = S
 5         var at:Int = find(S,"@")
 6         if at > 0
 7         {
 8             S = S.lowercased
 9             return (String(S[0]) + "*****" + S.subString(at - 1)).lowercased;
10         }
11         var arr:[Character] = Array(S)
12         for i in (0..<arr.count).reversed()
13         {
14             if arr[i] < "0" || arr[i] > "9"
15             {
16                 arr.remove(at:i)
17             }
18         }
19         S = String(arr)
20         return country[S.count - 10] + "***-***-" + S.subString(S.count - 4)
21     }
22 
23     func find(_ S:String,_ char:Character) -> Int
24     {
25         var arrS:[Character] = Array(S)
26         for i in 0..<arrS.count
27         {
28             if arrS[i] == char
29             {
30                 return i
31             }
32         }
33         return -1
34     }
35 }
36 
37 //String擴展
38 extension String {        
39     //subscript函數能夠檢索數組中的值
40     //直接按照索引方式截取指定索引的字符
41     subscript (_ i: Int) -> Character {
42         //讀取字符
43         get {return self[index(startIndex, offsetBy: i)]}
44     }
45     
46     // 截取字符串:從index到結束處
47     // - Parameter index: 開始索引
48     // - Returns: 子字符串
49     func subString(_ index: Int) -> String {
50         let theIndex = self.index(self.endIndex, offsetBy: index - self.count)
51         return String(self[theIndex..<endIndex])
52     }
53 }

Runtime: 8 ms
Memory Usage: 20.7 MB
 1 class Solution {
 2     func maskPII(_ S: String) -> String {
 3         if S.contains("@") {
 4             let name1 = String(S.split(separator: "@").first!)
 5             let name2 = String(S.split(separator: "@").last!)
 6             let res = String(name1.first!).lowercased() + "*****" + String(name1.last!).lowercased() + "@" + name2.lowercased()
 7             return res
 8         } else {
 9             var res = S
10             
11             if S.contains("+") {
12                res = res.replacingOccurrences(of: "+", with: "")
13             } 
14             if S.contains("-") {
15                 res = res.replacingOccurrences(of: "-", with: "")
16             } 
17             if S.contains("(") {
18                 res = res.replacingOccurrences(of: "(", with: "")
19             } 
20             if S.contains(")") {
21                 res = res.replacingOccurrences(of: ")", with: "")
22             } 
23             if S.contains(" ") {
24                 res = res.replacingOccurrences(of: " ", with: "")
25             }
26 
27             if res.count == 10 {
28                 res = "***-***-" + String(res.suffix(4))
29             } else if res.count == 11 {
30                 res = "+*-***-***-" + String(res.suffix(4))
31             } else if res.count == 13 {
32                 res = "+***-***-***-" + String(res.suffix(4))
33             } else {
34               res = "+**-***-***-" + String(res.suffix(4))
35             }
36             return res
37         }
38     }
39 }

19888kb

 1 class Solution {
 2     func maskPII(_ S: String) -> String {
 3         let emailArr = S.split(separator: "@")
 4         if emailArr.count == 2 {
 5             var prefix = emailArr[0].lowercased()
 6             return String(prefix.first!) + "*****" + String(prefix.last!) + "@" + emailArr[1].lowercased()
 7         }
 8 
 9         var pureDigtals = [Character]()
10         for c in S {
11             if c == "-" || c == "(" || c == ")" || c == "+" ||  c == " " {
12                 continue
13             }
14             pureDigtals.append(c)
15         }
16 
17         var lastFourStr = String(pureDigtals.suffix(4))
18 
19         if pureDigtals.count == 10 {
20             return  "***-***-" + lastFourStr
21         }
22         var starStr = "+"
23         for i in 0..<(pureDigtals.count - 10) {
24             starStr += "*"
25         }
26         return starStr + "-***-***-" + lastFourStr
27     }
28 }
相關文章
相關標籤/搜索