393. UTF-8 Validation

来源:互联网 发布:手机翻页电子书软件 编辑:程序博客网 时间:2024/05/17 18:00

思路:遍历一遍vector,按要求判断;
C++代码:

class Solution {public:    int num_of_bytes(int a) {        int i = 0;        while (a & (1<<(7-i))) {            if (i > 4)                return i;            i++;        }        return i;    }    bool test_01(int num) {        return (((num& (1<<7))==(1<<7))&&((num&(1<<6) )== 0));    }    bool validUtf8(vector<int>& data) {        int size = data.size();        if (size == 0) {            return false;        }        for (int i=0; i<size;) {            //cout<<"i="<<i<<endl;            int num = num_of_bytes(data[i]);            if (num > 4)                return false;            switch (num)  {                case (0):                     i++;                    continue;                case (1):return false;                case (2):                    if (size >=2 && test_01(data[i+1])) {                        i+=2;                        continue;                    } else {                        return false;                    }                case (3):                     if (size>=3 && test_01(data[i+1])&& test_01(data[i+2])) {                        i += 3;                        continue;                    } else {                        return false;                    }                case (4):                    if (size>=4 && test_01(data[i+1])&& test_01(data[i+2]) &&test_01(data[i+3])) {                        i += 4;                        continue;                    } else {                        return false;                    }            }        }        return true;    }};

其他解法:

class Solution {public:    bool validUtf8(vector<int>& data) {        int count = 0;        for (auto c : data) {            if (count == 0) {                if ((c >> 5) == 0b110) count = 1;                else if ((c >> 4) == 0b1110) count = 2;                else if ((c >> 3) == 0b11110) count = 3;                else if ((c >> 7)) return false;            } else {                if ((c >> 6) != 0b10) return false;                count--;            }        }        return count == 0;    }};