vivo新工业园在落成并入驻启用前,园艺工作人员为了给大家提供更好的办公子境,让大家享受清新空气,特意在新工业园中按园林设计规划种花植树。现在一块长方形的地上种植花草,因受到阳光、水分、肥料等因素影响,相邻的区域不能种植,不然可能导致花草竞争过于激烈而枯死。
假如用一个数列表示土地 上的种植情况(数列元素仅由0、1组成,1表示该区域已种植,0则表示末种植)。现在请你帮助园艺工作人员,在不影响原有花草的情况下,计算出可新种植的最大花草数量。
输入的第一行为一个数字, 表示土地的长度;
输入的第二行为一个由0和1组成并以空格分割的数列,表示该土地上目前的种植情况。
输出为一个数字,表示在原本的土地状态下,还可种下的最大花草数量。
8
1 0 0 0 0 0 1 0
方法① 取1和1之间的0来看,中间可以种几个,有一个公式是(n-1)/2就是计算中间种的多少,判断是1的时候,开始计0的个数,到下一个1为止。中间0的个数,就是n,带到公式里,就是中间可以种多少个,公式计算完取商即可。将所有结果相加就是这一排最多可以种多少。
方法② 先判断第一个位置能否种树,再种上第一棵树,判断第二个位置到倒数第二个位置能否种树,然后判断最后一个位置能否种树
在这里插入代码片 思路一
private static int test1(int[] array) {
if (array.length == 1) {
if (array[0] == 0) {
return 1;
} else {
return 0;
}
}
int count = 0, i = 0;
while (i < array.length) {
if (array[i]==0){
if (i == 0 ) {
if (array[i + 1] == 0) {
array[i] = 1;
count++;
}
} else if (i == array.length - 1 ) {
if (array[i - 1] == 0) {
array[i] = 1;
count++;
}
} else if (i > 0 && i < array.length - 1) {
if ((array[i - 1] == 0 && array[i + 1] == 0)) {
array[i] = 1;
count++;
}
}
}
i++;
}
return count;
}
在这里插入代码片 思路二
public int count() {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
if (n < 0){
return 0;
}
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = scanner.nextInt();
}
if (arr.length < 1){
return 0;
}
if (arr.length == 1){
return arr[0] == 0 ? 1 : 0;
}
if (arr.length == 2){
return (arr[0] == 0 && arr[1] == 0) ? 1 : 0;
}
// 三指针
int a = 0;
int b = 1;
int c = 2;
int cnt = 0;
// 判断第一个位置能否种树
if (arr[a] == 0 && arr[b] == 0){
cnt++;
arr[a] = 1;
}
// 判断第二个位置到倒数第二个位置能否种树
while(c < arr.length){
if(arr[a] == 0 && arr[b] == 0 && arr[c] == 0){
cnt++;
arr[b] = 1;
}
a++;
b++;
c++;
}
// 判断最后一个位置能否种树
if(arr[a] == 0 && arr[b] == 0){
cnt++;
arr[b] = 1;
}
return cnt;
}
vivo原有的制造中心受限于空间等资源,在生产某系列产品时,需要拆分出多个子流水线 来运作。随着2019年全新的智能制造中心的落成,现需将该系列产品的多个子流水线合并 为一整条完整的流水线。
假设用一个由工序编码组成的有序链表来表示条子流水线,请编程实现合并的功能。
第一行由一个数字n组成,n<1000,表示有n个子流水线;
接下来共有n行,每行由空格分割的-组数字组成,表示子流水线的工序编码;
工序编码的大小决定了相对顺序,编码较小的始终在前;
工序编码全局有效,多个子流水线上的相同编码始终代表同一工字。
合并后的用工序编码表示的完整流水线,各工序编码之间由空格分割。
4
2 4 8
3 4 6
5 8 9 11
1 6 7 10 12
1 2 3 4 4 5 6 6 7 8 8 9 10 11 12
//定义链表
private static class ListNode {
int val;
ListNode next;
public ListNode(int val) {
this.val = val;
}
}
//多条链表的合并 题目三
private static ListNode test3() {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
sc.nextLine(); // 很重要,跳到第二行
String[] strArr = new String[m];
List<Integer> list = new ArrayList<>();
// 从第二行开始读取
for (int i = 0; i < m; i++) {
strArr[i] = sc.nextLine();
String[] array = strArr[i].split("-");
for (int j = 0; j < array.length; j++) {
//System.out.println(array[j]);
list.add(Integer.valueOf(array[j]));
}
}
//排序
Collections.sort(list);
//建立头结点
ListNode listNode = new ListNode(0);
ListNode curr = listNode;
for (int v : list) {
curr.next = new ListNode(v);
curr = curr.next;
}
return listNode.next;
}
vivo每款智能手机在量产 上市前必须经过严格的测试,其中项就是手机跌落测试 ,用来评估手机从一定高度跌落到地面而保持屏幕完整的能力。 在vivo测试中心,有一个专用 的跌落测试塔,共由N层楼组成,每层间隔定高度。 将测试塔放置在基础台面上,然后 将待测手机从测试塔不同楼层将手机以一定的速度推出跌落至地面。 根据测试精度的需要,测试塔层数以及层间隔高度可以任意调整,但不超过10000 (即N <= 1000 )。
现假设存在一个楼层F(0<=F<=N) ,当楼层高于F时,手机屏会被摔碎,当楼层不高于F时则不会碎。每次测试时测试人员可以将待测手机从任意一层的位置推出 ,直到确切 地找到F的值。
请问给定K台测试手机,最少需要测试多少次才能准确的测出F的值?
输入为2个正整数K和N,用空格分隔。
输出为1个正整数,表示能确切找到时的最少测试次数。
1 2
2
在这里插入代码片