• 最大的位或(思维)


    最大的位或

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 1197    Accepted Submission(s): 484


    Problem Description
    B君和G君聊天的时候想到了如下的问题。
    给定自然数l和r ,选取2个整数x,y满足l <= x <= y <= r ,使得x|y最大。
    其中|表示按位或,即C、 C++、 Java中的|运算。
     
    Input
    包含至多10001组测试数据。
    第一行有一个正整数,表示数据的组数。
    接下来每一行表示一组数据,包含两个整数l,r。
    保证 0 <= l <= r <= 1018
     
    Output
    对于每组数据输出一行,表示最大的位或。
     
    Sample Input
    5 1 10 0 1 1023 1024 233 322 1000000000000000000 1000000000000000000
     
    Sample Output
    15 1 2047 511 1000000000000000000
     题解:让在l和r之间找两个数的最大或值,思路,先把十进制转化成二进制,分为两种情况,如果r的二进制长度比l长,那么肯定有11111在l和r之间,或值就是全是1,如果长度相同,只需要找后面开始不相同的位直接全1与r或就可以了
    代码:
    import java.util.Scanner;
    
    public class Main {
        private static Scanner cin;
        static{
            cin = new Scanner(System.in);
        }
        public static char[] stringToChar(String s){
            char arr[] = new char[s.length()];
            for(int i = 0; i < s.length(); i++){
                arr[i] = s.charAt(i);
            }
            return arr;
        }
        
        public static Long SystemChange(char[] s, int radix){
            Long ans = 0L;
            //System.out.print("转换前: ");
            for(int i = 0; i < s.length; i++){
                ans = ans * radix + s[i] - '0';
            }
            //System.out.println("转换后: " + ans);
            return ans;
        }
        
        public static void main(String[] args) {
            int T;
            T = cin.nextInt();
            Long l, r;
            while(T-- > 0){
                l = cin.nextLong();
                r = cin.nextLong();
                if(l > r){
                    Long temp = l;
                    l = r;
                    r = temp;
                }
                String bl = l.toBinaryString(l);
                String br = r.toBinaryString(r);
                
                if(br.length() > bl.length()){
                    System.out.println(pow(br.length()) - 1);
                }else{
                    int i;
                    for(i = 0; i < br.length(); i++){
                        if(bl.charAt(i) != br.charAt(i))
                            break;
                    }
                    long temp = pow(br.length() - i) - 1;
                    
                    System.out.println(r|temp);
                }
            }
        }
    
        private static long pow(int length) {
            long x = 1;
            while(length-- > 0){
                x = x << 1;
            }
            return x;
        }
        
    }
  • 相关阅读:
    [Swift]LeetCode632. 最小区间 | Smallest Range
    [Swift]有用的Binary Heap Type类
    [Swift]LeetCode633. 平方数之和 | Sum of Square Numbers
    [Swift]LeetCode630. 课程表 III | Course Schedule III
    [Swift]LeetCode629. K个逆序对数组 | K Inverse Pairs Array
    [Swift]LeetCode628. 三个数的最大乘积 | Maximum Product of Three Numbers
    [SQL]LeetCode627. 交换工资 | Swap Salary
    [SQL]LeetCode626. 换座位 | Exchange Seats
    [Swift]LeetCode623. 在二叉树中增加一行 | Add One Row to Tree
    [Swift]LeetCode622. 设计循环队列 | Design Circular Queue
  • 原文地址:https://www.cnblogs.com/handsomecui/p/6557045.html
Copyright © 2020-2023  润新知