- 🍁 个人主页:爱编程的Tom
- 💫 本篇博文收录专栏:每日一练-算法篇
- 👉 目前其它专栏:c系列小游戏 c语言系列--万物的开始_ Java专栏等
- 🎉 欢迎 👍点赞✍评论⭐收藏💖三连支持一下博主🤞
- 🧨现在的沉淀就是对未来的铺垫
今天继续练习算法题,又是充实的一天呢~
今日题目: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);}