golang 敏感字段加密

一道华为机考题,当时没做出,思绪太乱了

微信图片_20220513224137.jpg
package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
)

type Stack struct {
    list []byte
}

func main() {
    var command string
    input := bufio.NewScanner(os.Stdin)
    input.Scan()
    n, _ := strconv.Atoi(input.Text())
    input.Scan()
    command = input.Text()
    res := dealCommand(command,n)
    fmt.Println(res)
}

func dealCommand(s string,n int) string {
    var s1 string
    var s2 string
    var tags []int
    stack := NewStack()
    var i,j = 0,len(s)-1
    // 整理字符串,去除字符串首位下划线
    for s[i] == '_' {
        i++
    }
    for s[j] == '_' {
        j--
    }
    s1 = s[i:j+1]
    //继续整理字符串,对双引号括着的字段外的下划线去重
    for i =0; i< len(s1); i++ {
        if i>0 && s1[i]=='_' && s1[i-1] =='_' && stack.IsEmpty(){
            continue
        }
        if s1[i] == '"' && stack.IsEmpty() { //如果栈是空的,遇到双引号进栈
            stack.Push(s1[i])
            s2 = s2 + string(s1[i])
            continue
        }
        if s1[i] == '"' && !stack.IsEmpty() { //轮到下一个双引号来了必出栈
            stack.Pop()
            s2 = s2 + string(s1[i])
            continue
        }
        s2 = s2 + string(s1[i])
    }
    for i =0;i<len(s2);i++ {
        if s2[i] == '_' && stack.IsEmpty() { //记录正确分隔各个关键字的下划线位置
            tags = append(tags,i)
        }
        if s2[i] == '"' && stack.IsEmpty() {
            stack.Push(s1[i])
            continue
        }
        if s2[i] == '"' && !stack.IsEmpty() {
            stack.Pop()
            continue
        }
    }
    if n == 0 { //第0位敏感字段加密
        return "******" + s2[tags[0]:]
    } else if n == len(tags) { //最后一位敏感字段加密
        return s2[0:tags[len(tags)-1]+1] + "******"
    } else { //中间部分敏感字段加密
        return s2[:tags[n-1]+1] + "******" + s2[tags[n]:]
    }
    return ""
}

func NewStack() *Stack {
    return &Stack{}
}

func (s *Stack) Push(b byte) {
    s.list = append(s.list,b)
}

func (s *Stack) Pop() byte {
    r := s.list[len(s.list)-1]
    s.list = s.list[:len(s.list)-1]
    return r
}

func (s *Stack) IsEmpty() bool {
    if len(s.list) == 0 {
        return true
    }
    return false
}

下面是输入输出(前两行输入,后一行输出)

6
__assd_1342___jsjd_"skdd__ddd"_jss_44__""_
assd_1342_jsjd_"skdd__ddd"_jss_44_******
3
__assd_1342___jsjd_"skdd__ddd"_jss_44__""_
assd_1342_jsjd_******_jss_44_""
0
__assd_1342___jsjd_"skdd__ddd"_jss_44__""_
******_1342_jsjd_"skdd__ddd"_jss_44_""
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容