Day3--每日一练

今天继续练习算法题,又是充实的一天呢~

今日题目:1. 简写单词

                  2. dd爱框框

                  3. 数组除2操作,要求数组之和最小

题目一

简写单词,要求输入一系列单词,只输出每个单词的首字母并大写。

这里只用获取首字母即可,代码如下:

//简写单词
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            char ch = sc.next().charAt(0);
            if (ch >= 'a' && ch <= 'z'){
                System.out.println((char) (ch-32));
            }else {
                System.out.print(ch);
            }
        }
    }

题目二 

题目描述:dd爱框框

给一个数组,指定一个和,求数组中累加大于和的区间段,最终找出最先大于和的区间段

解决思路:利用同向指针--滑动窗口的模式进行解题,主要分为四步,右区间进窗口,判断条件,更新结果,左区间出窗口,最终返回区间的和。 

代码如下

 public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        int[] arr = new int[n +1];
        for (int i = 1; i < n; i++) {
            arr[i] = in.nextInt();
        }
        int right = 1;
        int left = 1;
        int sum = 0;
        int retright = -1;
        int retleft = -1;
        int retLen = n;
        while (right <= n) {
            sum += arr[right];
            while (sum >= k) {
                if (right-left+1 > retLen) {
                    retleft = left;
                    retright = right;
                    retLen = right-left+1;
                }
                sum -= arr[left];
            }
            right++;
        }
        System.out.println(sum);
    }

但运行时发现,代码超时了!!!!!一时间也没啥头绪,最后发现需要自己编写一个快读函数调用,哎~,代码放在下面了……

class Read // 自定义快速读入
{
    StringTokenizer st = new StringTokenizer("");
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String next() throws IOException 
    {
        while(!st.hasMoreTokens())
        {
            st = new StringTokenizer(bf.readLine());
        }
        return st.nextToken();
    }
    
    String nextLine() throws IOException 
    {
        return bf.readLine();
    }
    
    int nextInt() throws IOException 
    {
        return Integer.parseInt(next());
    }
    
    long nextLong() throws IOException 
    {
        return Long.parseLong(next());
    }
    
    double nextDouble() throws IOException 
    {
        return Double.parseDouble(next());
    }
}

题目三

题目描述:给一个数组,一共有 n 个数。 你能进行最多k次操作。每次操作可以进行以下步骤

选择数组中的一个偶数 ai,将其变成 ai/2。 现在你进行不超过k次操作后,让数组中所有数之和尽可 能小。请输出这个最小的和。

解题思路:创建一个大根堆,每次取堆顶元素(即数组中的最大值)进行除2操作,,是偶数就重新入堆,当堆为空或者操作结束,程序结束。主要是模拟上述情景的实现。

代码如下:

public static void main3(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int k = in.nextInt();
        //创建大根堆,堆顶元素减半,是偶数重新入堆
        PriorityQueue<Integer> heap = new PriorityQueue<>((a, b)->{
            return b-a;
        });
        long sum = 0;
        int  x = -1;
        for (int i = 0; i < n; i++) {
            x = in.nextInt();
            sum += x;
            if (x % 2 == 0) {
                heap.add(x);
            }
        }
        while (!heap.isEmpty() && k-- != 0) {
            int t = heap.poll() / 2;
            sum -= t;
            if (t % 2 == 0) {
                heap.add(t);
            }
        }
        System.out.println(sum);
    }

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱编程的Tom

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值