Monday, August 17, 2015

真题练习[0]: Toggle Bulbs | 形&影



真题练习[0]: Toggle Bulbs | 形&影
有n个灯泡。每个灯泡有on 和off两个状态。
实现 bool isOn(int pos)来查询index为pos的灯泡的状态,void toggle(int begin, int end)来改变 begin 到end范围内所有灯泡的状态。
Follow up: 如果toggle很常用如何优化?
Notes: 自然而然可以想到用一个bool数组来表示灯泡序列。再一想,可以bit manipulation,用一个int存储32个灯泡,一个vector<int>来表示所有灯泡。如果begin和end在同一区间时间复杂度是O(1),否则是O(n),空间是O(1)。只想到用vector<int>,没有想到记录toggle的历史。
对于toggle的优化可以这样:首先有一个vector来记录toggle历史,然后isOn的时候遍历容器,看pos有多少次落在记录的区间里,统计次数之后对2求余,但查询次数越多统计就会越慢。再接着优化可以用set,插入前查询,是否有同样区间被toggle过,有就删除记录并停止插入,没有就插入。
Tips:当一个算法性能上已经足够优化时,进一步优化应该考虑用空间换时间。
vector<int> init( int n ){
    int sectionNum = n/32;
    if( n % 32 != 0 ) ++sectionNum;
    return vector<int> bulbs( sectionNum, 0 );
}
bool isOn(int pos){
    int section = pos/32;
    pos  = pos%32;
    return( bulbs[section] & (1 << pos) );
}
void toggleInSec(int begin, int end, int &bulbSec){
    // when in the same section
    int mask = 0 ^ ( ( 1 << (begin-end+1)) - 1  ); // set the last begin-end+1 bit to 1
    mask = mask << (begin%32-1);
    bulbSec ^= mask;
}
void toggle(int begin, int end, vector<int> &bulbs){
    int section_bg = begin/32, section_ed = end/32;
    if(section_bg == section_ed )
        toggleInSec(begin, end, bulbs[section_bg]);
    else{
        for(int i = section_bg + 1 ; i < section_ed; ++i ){
            bulbs[i]  = ~bulbs[i];
        }
        toggleInSec(begin%32,31,bulbs[section_bg]);
        toggleInSec(0,end%32, bulbs[section_ed]);
    }      
}
Read full article from 真题练习[0]: Toggle Bulbs | 形&影

Labels

Review (572) System Design (334) System Design - Review (198) Java (189) Coding (75) Interview-System Design (65) Interview (63) Book Notes (59) Coding - Review (59) to-do (45) Linux (43) Knowledge (39) Interview-Java (35) Knowledge - Review (32) Database (31) Design Patterns (31) Big Data (29) Product Architecture (28) MultiThread (27) Soft Skills (27) Concurrency (26) Cracking Code Interview (26) Miscs (25) Distributed (24) OOD Design (24) Google (23) Career (22) Interview - Review (21) Java - Code (21) Operating System (21) Interview Q&A (20) System Design - Practice (20) Tips (19) Algorithm (17) Company - Facebook (17) Security (17) How to Ace Interview (16) Brain Teaser (14) Linux - Shell (14) Redis (14) Testing (14) Tools (14) Code Quality (13) Search (13) Spark (13) Spring (13) Company - LinkedIn (12) How to (12) Interview-Database (12) Interview-Operating System (12) Solr (12) Architecture Principles (11) Resource (10) Amazon (9) Cache (9) Git (9) Interview - MultiThread (9) Scalability (9) Trouble Shooting (9) Web Dev (9) Architecture Model (8) Better Programmer (8) Cassandra (8) Company - Uber (8) Java67 (8) Math (8) OO Design principles (8) SOLID (8) Design (7) Interview Corner (7) JVM (7) Java Basics (7) Kafka (7) Mac (7) Machine Learning (7) NoSQL (7) C++ (6) Chrome (6) File System (6) Highscalability (6) How to Better (6) Network (6) Restful (6) CareerCup (5) Code Review (5) Hash (5) How to Interview (5) JDK Source Code (5) JavaScript (5) Leetcode (5) Must Known (5) Python (5)

Popular Posts