华为2016实习生上机题

1、

简单题,直接遍历一般即可。

import java.util.Scanner;
 public class Main{
    public static void main(String []args){
        Scanner cin=new Scanner(System.in);
        String s;
        while(cin.hasNext()){
            s=cin.nextLine();
            int n=s.length();
            char pre=s.charAt(0);
            int ans=1;
            String res="";
            for(int i=1;i<n;i++){
                char cur=s.charAt(i);
                if(!((cur>='A'&&cur<='Z')||(cur>='a'&&cur<='z')))continue;
                //System.out.println();
                if(pre!=cur){

                        res+=pre;
                        res+=ans;


                    pre=cur;
                    ans=1;
                }else
                    ans++;

            }
            res+=pre;
            res+=ans;
            System.out.println(res);
        }
    }
}

2、

栈的思想

  • 如果遇到”(“,则入栈;
  • 遇到”)”,则出栈;说明该盒子里没有礼物,则不打开。
  • 遇到”A”,则跳出循环。
    解即为栈的size。
import java.util.Scanner;
import java.util.Stack;
public class Test {
    public static void main(String []args){
        Scanner cin=new Scanner(System.in);
        String s;

        while(cin.hasNext()){
            s=cin.nextLine();
            int n=s.length();
            int cnt=0;
            Stack<String>stk=new Stack<String>();
            for(int i=0;i<n;i++){
                char tmp=s.charAt(i);
                if(tmp==')')stk.pop();
                else
                    if(tmp=='(')stk.push("(");
                    else
                        if(tmp=='A')break;
                if(s.charAt(i)=='('&&s.charAt(i+1)!=')')cnt++;
                else
                    if(s.charAt(i)=='A')break;
            }
            System.out.println(stk.size());

        }
    }
}

3、
贪心思想,这题因为提交次数过多,最后只拿到189,下面是最终修改的方法,应该正确了。

  • 若mp>=10,则玩家使用魔法,直到玩家被消灭或者mp<10时,停止使用魔法;
  • 否则,有两种情况,玩家要么一直使用普通攻击,要么选择恢复魔法;分别计算两种情况,直到玩家被消灭或者魔法恢复或者BOSS被消灭。
    需要注意的时,玩家先玩。。。。
import java.util.Scanner;
public class Main{
    static int min=Integer.MAX_VALUE;
    public static void dfs(int hp1,int mp,int hp2,int cnt){
        if(hp1<=0){
            if(hp2<=0){
                if(min>(cnt-1))min=cnt-1;
            }
            return ;
        }
        if(hp2<=0){
            if(min>(cnt-1))min=cnt-1;
            return ;
        }

        if(mp>=10){
            int ans=mp/10;
            int ans1=hp2%60!=0?hp2/60+1:hp2/60;
            if(ans1<ans)ans=ans1;
            int tmp=hp2;
            for(int i=0;i<ans;i++){
                if(cnt%5==0)hp1-=30;
                else
                    hp1-=10;
                cnt++;
                if(hp1<=0)break;
                tmp-=60;
            }
            dfs(hp1,mp-10*ans,tmp,cnt);
        }else{
            int hp=hp1;
            int ans=hp2/17;
            if(hp2%17!=0)ans++;
            int tmp=hp2;
            for(int i=0;i<ans;i++){
                if(cnt%5==0)hp1-=30;
                else
                    hp1-=10;
                cnt++;
                if(hp1<=0)break;
                tmp-=17;
            }
            dfs(hp1,mp,tmp,cnt);
            hp1=hp;
            ans=(10-mp)/4;
            if((10-mp)%4!=0)ans++;
            for(int i=0;i<ans;i++){
                if(cnt%5==0)hp1-=30;
                else
                    hp1-=10;
                cnt++;
                if(hp1<=0)break;
                mp+=4;
            }
            dfs(hp1,mp,hp2,cnt);
        }
    }
    public static void main(String []args){
        Scanner cin=new Scanner(System.in);
        int hp1,mp,hp2;

        while(cin.hasNext()){
            hp1=cin.nextInt();
            mp=cin.nextInt();
            hp2=cin.nextInt();
            min=Integer.MAX_VALUE;
            dfs(hp1,mp,hp2,1);
            if(min==Integer.MAX_VALUE)System.out.println(-1);
            else
                System.out.println(min);

        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>