2022寒假每日一题【C++,python,java,Go语言各写一遍巩固语言基础】

第一周

2058. 笨拙的手指

传送门

这是C++的代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N=500;
string a,b;
int A,B;
int aa[N];
int bb[N];
unordered_map<int,int>mp;
signed main(){
    aa[0]=1;
    bb[0]=1;
    for(int i=1;i<N;i++)aa[i]=aa[i-1]*2,bb[i]=bb[i-1]*3;
    
    cin>>a>>b;
    int la=a.length();
    int lb=b.length();
    for(int i=la-1;i>=0;i--)A+=aa[la-1-i]*(a[i]-'0');
    //cout<<A<<endl;
    for(int i=la-1;i>=0;i--){
        int x=a[i]-'0';
        int t=A;
        t-=aa[la-1-i]*x;
        t+=aa[la-1-i]*(1-x);//x错了,把x变换
        mp[t]=1;
    }
    for(int i=lb-1;i>=0;i--)B+=bb[lb-1-i]*(b[i]-'0');
    // if(b[0]=='0'){
    //     int x=b[0]-'0';
    //     int t=B-x*bb[lb-1];
    //     if(mp.count(t)){
    //         cout<<t;
    //         return 0;
    //     }
    //     if(mp.count(t+bb[lb-1])){
    //         cout<<t;
    //         return 0;
    //     }
    // }
    for(int i=lb-1;i>=0;i--){
        int x=b[i]-'0';
        int t=B;
        int j=lb-1-i;
        t-=bb[j]*x;
        if(x==0){
            if(mp.count(t+bb[j])){
                cout<<t+bb[j];
                return 0;
            }
            if(mp.count(t+bb[j]*2)){
                cout<<t+bb[j]*2;
                return 0;
            }
        }
        if(x==1){
            if(mp.count(t)){
                cout<<t;
                return 0;
            }
            if(mp.count(t+bb[j]*2)){
                cout<<t+bb[j]*2;
                return 0;
            }
        }
        if(x==2){
            if(mp.count(t)){
                cout<<t;
                return 0;
            }
            if(mp.count(t+bb[j])){
                cout<<t+bb[j];
                return 0;
            }
        }
    }
    
    
}
这是python的代码
a=input()
b=input()
ls_a=[]
ls_b=[]
bb=[]
la=len(a)
lb=len(b)
def f1(i:int ,x:int):
    if x==0:
        y1=(B-(int)(b[lb-1-i])*pow(3,i) + 1*pow(3,i) )
        y2=(B-(int)(b[lb-1-i])*pow(3,i) + 2*pow(3,i) )
    elif x==1:
        y1=(B-(int)(b[lb-1-i])*pow(3,i) + 0*pow(3,i) )
        y2=(B-(int)(b[lb-1-i])*pow(3,i) + 2*pow(3,i) )
    else:
        y1=(B-(int)(b[lb-1-i])*pow(3,i) + 0*pow(3,i) )
        y2=(B-(int)(b[lb-1-i])*pow(3,i) + 1*pow(3,i) )
        
    return [y1,y2]
    
A=0
for i in range(0,la):
    A+=(int)(a[la-1-i]) * pow(2,i)
    
B=0
for i in range(0,lb):
    B+=(int)(b[lb-1-i]) * pow(3,i)
    
for i in range(0,la):
    ls_a.append( A-(int)(a[la-1-i])*pow(2,i) + (1-(int)(a[la-1-i]))*pow(2,i) )
for i in range(0,lb):
    bb=f1(i,(int)(b[lb-1-i]))
    ls_b.append(bb[0])
    ls_b.append(bb[1])
    
    
for i in ls_a:
    for j in ls_b:
        if i==j:
            print(i)
    
这是java的代码
import java.util.*;
public class Main{
    static Set<Integer>set=new HashSet<>();
    static char a[],b[];
    static int y1,y2;
    static int f2(){
        int ans=0;
        int len=a.length;
        for(int i=0;i<len;i++){
            ans+=(a[i]-'0') <<len-1-i;
        }
        //System.out.println("f2 ans = "+ans);
        return ans;
    }
    static int f3(){
        int ans=0;
        int t=1;
        int len=b.length;
        for(int i=len-1;i>=0;i--){
            ans+=(b[i]-'0')*t;
            t*=3;
        }
        //System.out.println("f3 ans = "+ans);
        return ans;
    }
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        a=in.next().toCharArray();
        //System.out.println("f2 ans = "+f2());
        b=in.next().toCharArray();
        //System.out.println("f3 ans = "+f3());
        for(int i=0;i<a.length;i++){
            a[i]=(char)('1'+'0'- a[i]);
            set.add(f2());
            a[i]=(char)('1'+'0'- a[i]);
        }
        for(int i=0;i<b.length;i++){
            char c=b[i];
            if(c=='0'){
                b[i]='1';
                y1=f3();
                b[i]='2';
                y2=f3();
            }
            else if(c=='1'){
                b[i]='0';
                y1=f3();
                b[i]='2';
                y2=f3();
            }
            else{
                b[i]='0';
                y1=f3();
                b[i]='1';
                y2=f3();
            }
            if(set.contains(y1)){
                System.out.print(y1);
                return;
            }
            if(set.contains(y2)){
                System.out.print(y2);
                return;
            }
            b[i]=c;
        }
    }
    
}

这是Go语言代码
package main

import "fmt"
func main(){
    var a,b string
    fmt.Scanf("%s\n%s",&a,&b)
    
    var lena,lenb int = len(a),len(b)
    var A,B int
    for i:=0; i<lena; i++ {
        A = A*2 + int(a[i]-'0')
    }
    for i:=0; i<lenb; i++ {
        B = B*3 + int(b[i]-'0')
    }
    
    var mp map[int]struct{} = make(map[int]struct{})
    
    for i, j:= lena-1, 1;i>=0;i, j= i-1, j<<1{
        mp[A^j] = struct{}{}
    }
    for i,j :=lenb-1,1;i>=0; i,j = i-1,j*3 {
        for x:=0 ; x<3 ; x = x+1{
            if x== int(b[i]-'0'){continue}
            
            t:= B - int(b[i]-'0')*j + x*j;
            if _,ok := mp[t]; ok{
                fmt.Print(t)
                return
            }
        }
    } 
}

在这里插入图片描述
Go跟C++比差不多快,开发难度简单很多
Go跟python比开发难度差不多,但是快很多

2041. 干草堆

传送门
C++代码

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=1e6+10;
int a[N];
int n,m;
signed main(){
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int l,r;
        cin>>l>>r;
        a[l]+=1;
        a[r+1]-=1;
        // if(r==n)a[r]-=1;
        // else a[r+1]-=1;
    }
    for(int i=1;i<=n;i++)a[i]+=a[i-1];
    sort(a+1,a+1+n);
    //for(int i=1;i<=n;i++)cout<<a[i]<<" ";
    cout<<a[(1+n)/2];
}

python代码

def main():
    n, m = map(int, input().split())
    a = [0]*(n+2)
    for _ in range(m):
        l,r = map(int,input().split())
        a[l]+=1
        a[r+1]-=1
    
    for i in range(1,n+2):
        a[i]+=a[i-1]
    
    a = a[1:n+1]
    a.sort()
    print(a[n//2])
    return

main()

java代码

import java.util.*;

public class Main{
    public static void main(String []args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int []a = new int[n+2];
        while(m-- >0){ //这里注意,java里的true不是1而是Boolean变量
            int l=sc.nextInt();
            int r=sc.nextInt();
            a[l]++;
            a[r+1]--;
        }
        for(int i=1;i<=n;i++)a[i]+=a[i-1];
        int []b=new int[n];
        for(int i=0;i<n;i++)b[i]=a[i+1];
        Arrays.sort(b);
        System.out.print(b[n/2]);
        //Arrays.sort(c , Collections.reverseOrder());
        /*
        Integer []c = {1,2,3,4,5,6,7};
        //Arrays.sort(c , Collections.reverseOrder());
        Comparator cmp = new MyComparator();
        Arrays.sort(c,cmp);
        for(int t:c){
            System.out.print(t+" ");
        }
        */
        
    }
    
}
class MyComparator implements Comparator<Integer>{
    @Override
    public int compare(Integer a,Integer b){
        return b-a;
    }
}

Go代码

package main

import (
    "fmt"
    "sort"
    
)

func main(){
    var(
        l,r,n,m int
    )
    fmt.Scan(&n,&m)
    a:=make([]int,n)
    for o:=1;o<=m;o++{
        fmt.Scan(&l,&r)
        l--
        r--
        a[l]++
        if r==n-1{
            continue
        }else {
            a[r+1]--
        }
    }
    for i:=1;i<n;i++{
        a[i]+=a[i-1]
    }
    sort.Ints(a)
    fmt.Print(a[n/2])
    
}


2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



2041. 干草堆

传送门
C++代码


python代码


java代码


Go代码



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值