dengxinyi 6 years ago
parent
commit
42382c5098

+ 55 - 0
medium/388.longest-absolute-file-path.go

@@ -0,0 +1,55 @@
+type pair struct {
+	_1 int // level
+	_2 int // length
+}
+
+func lengthLongestPath(input string) (max int) {
+	st := make([]pair, 0)
+	strs := strings.Split(input, "\n")
+	cnt := 0
+	for i := range strs {
+		pre, l := 0, len(st)
+		if l == 0 {
+			pre = -1
+		} else {
+			pre = st[l-1]._1
+		}
+		lvnlen, isFile := process(strs[i], pre)
+		for l != 0 && st[l-1]._1+1 != lvnlen._1 {
+			cnt -= st[l-1]._2
+			st = st[:l-1]
+			l--
+		}
+		st = append(st, lvnlen)
+		cnt += lvnlen._2
+		if isFile && max < cnt {
+			max = cnt
+		}
+	}
+	return
+}
+
+func process(s string, pre int) (lvnlen pair, isFile bool) {
+	tabs, spaces, l := 0, 0, 0
+	for _, r := range s {
+		l++
+		switch r {
+		case '\t':
+			tabs++
+		case ' ':
+			spaces++
+		case '.':
+			isFile = true
+		}
+	}
+	if tabs <= pre+1 && pre+1 <= tabs+spaces/4 { // 4 spaces can also be regarded as tabs >:-(
+		lvnlen._1, lvnlen._2 = pre+1, l-tabs-(pre+1-tabs)*4
+	} else {
+		lvnlen._1, lvnlen._2 = tabs, l-tabs
+	}
+	if !isFile {
+		lvnlen._2++
+	}
+	return
+}
+

+ 7 - 0
medium/390.elimination-game.go

@@ -0,0 +1,7 @@
+func lastRemaining(n int) int {
+	// 1 2 3 4 5 6 -> 2 4 6 -> 2 * (1 2 3) -> 2 * (n/2 + 1 - remaining)
+	if n == 1 {
+		return 1
+	}
+	return 2 * (n/2 + 1 - lastRemaining(n/2))
+}

+ 15 - 0
medium/392.is-subsequence.go

@@ -0,0 +1,15 @@
+func isSubsequence(s string, t string) bool {
+	if s == "" {
+		return true
+	}
+	k, m, n := 0, len(s), len(t)
+	for i := 0; i < n; i++ {
+		if s[k] == t[i] {
+			k++
+			if k == m {
+				return true
+			}
+		}
+	}
+	return false
+}

+ 28 - 0
medium/393.utf-8-validation.go

@@ -0,0 +1,28 @@
+func validUtf8(data []int) bool {
+	n, cnt := len(data), 0
+	for i, m := 0, 0; i < n; i++ {
+		if cnt != 0 {
+			if data[i]>>6 != 2 {
+				return false
+			}
+			cnt--
+			continue
+		}
+		// b10000000 = 0x80
+		for m = 0x80; m&data[i] != 0; m >>= 1 {
+		}
+		switch m {
+		case 0x80: // 0xxxxxxx
+		case 0x20: // 110xxxxx
+			cnt = 1
+		case 0x10: // 1110xxxx
+			cnt = 2
+		case 0x08: // 11110xxx
+			cnt = 3
+		default:
+			return false
+		}
+	}
+	return cnt == 0
+}
+

+ 3 - 0
medium/394.decode-string.go

@@ -0,0 +1,3 @@
+func decodeString(s string) string {
+	
+}