CCF CSP认证JAVA(一)

202109-1数组推导

在这里插入图片描述

//100分
import java.util.Scanner;
public class Main {
    public static void main(String [] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int []arr = new int[n];
        for(int i=0;i<arr.length;i++){
            arr[i] = scanner.nextInt();
        }
        int min = arr[0],max = arr[0];
        for(int i=1;i<arr.length;i++){
            if (arr[i]>arr[i-1]){
                min=min+arr[i];
            }
            max=max+arr[i];
        }
        System.out.println(max+"\n"+min);
    }
}


202104-1灰度直方图

在这里插入图片描述

//100分
public class Main {
    public static void main(String [] args){
        run();
    }
    public static void run(){
        //输入
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        int l = scanner.nextInt();
        int[] h = new int[l];
        int[] ele = new int[n*m];
        for(int i=0;i<n*m;i++){
            ele[i]=scanner.nextInt();
        }
        //计算
        for(int i=0;i<h.length;i++){
            int z=0;
            for(int j=0;j<ele.length;j++){
                if (i==ele[j]){
                    z++;
                }
            }
            h[i]=z;
        }
        //输出
        for(int i=0;i<h.length;i++){
            if (i==h.length-1){
                System.out.print(h[i]);
            }else {
                System.out.print(h[i]+" ");
            }
        }
    }
}

System.out.print()输出不自动换行;System.out.println()会自动换行

栗子:每输出5个数据换一行

//其实就是加一个计数器
int a=1;
  for(int i=0;i<20;i++){
      System.out.print(i+" ");
      if(a%5==0){
          System.out.println();
      }
      a++;
  }

202109-2非零段划分

在这里插入图片描述

HashMap和TreeMap

  • HashMap:基于哈希表实现,继承AbstractMap。适用于在Map中插入、删除和定位元素。
  • Treemap:基于红黑树实现,继承自SortedMap。适用于按自然顺序或自定义顺序遍历键(key)。
  • HashMap通常比TreeMap快一点(树和哈希表的数据结构使然),建议多使用HashMap,在需要排序的Map时候才用TreeMap。

思路

  1. 写一个计算某数组arr[i]中非零段的个数的函数notZero();

  2. 在Map中存储数组中每一种非零的值以及其对应在数组中的下标位置(list表示);

    (此时为了方便后面的操作,在数组两端各加一个0,这样并不会影响结果)

  3. 从小到大遍历数组中每一种非零的值(由于不需要输出key值,此处使用values遍历),并将其在每个位置都置零,再计算当前数组的非零段个数。

  4. 非零段数的改变:改变某位置的元素为0,若它的前一个元素和后一个元素都非零,则非零段数在原基础上加一;若它的前一个元素和后一个元素都为零,则非零段数在原基础上减一;其余情况的非零段数不改变。

  5. 使用Math.max()找到最大非零段数,输出即可。

//100分
public class Main {
    public static void main(String [] args){
        
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int[] arr = new int[n+2];
        arr[0]=arr[n+1]=0;
        
        Map<Integer, ArrayList<Integer>> map = new TreeMap<>();
        for(int i=1;i<= n;i++){
            arr[i]= scanner.nextInt();
            if (arr[i]!=0){
                if (map.containsKey(arr[i])){
                    map.get(arr[i]).add(i);
                }else {
                    ArrayList<Integer> list = new ArrayList<>();
                    list.add(i);
                    map.put(arr[i],list);
                }
            }
        }
        
        int count = notZero(arr);
        int max = count;
        Collection<ArrayList<Integer>> lists = map.values();
        for (ArrayList<Integer> list:lists){
            for (int i:list){
                arr[i]=0;
                if(arr[i-1] != 0 && arr[i+1] != 0){
                    count++;
                }else if (arr[i-1] == 0 && arr[i+1] == 0){
                    count--;
                }
            }
            max = Math.max(max,count);
        }
        System.out.println(max);
    }
    /**
     * 计算非零段个数
     * @param arr
     * @return
     */
    public static int notZero(int[] arr){
        int nums = 0;
        for(int i=0;i<arr.length;i++){
            if (arr[i]!=0){
                nums++;
                for (int j=i+1;j<arr.length;j++){
                    i=j;
                    if(arr[j]!=0){
                        continue;
                    }else {
                        break;
                    }
                }
            }
        }
        return nums;
    }
}

Map遍历

方法一:

通过forEach接口

Integer value=null;
myMap.forEach((k,v)->
{
  value=v;
});

方法二:

通过keySet遍历(先得到key的值,再通过key值得到value值)

String key = null;
Integer value = null;
Iterator iter = myMap.keySet().iterator();
while (iter.hasNext()) {
    key = (String)iter.next();
    value = (Integer)myMap.get(key);
}

方法三:

通过entrySet遍历(通过Map.entrySet使用迭代器iterator遍历key和value)

Map.Entry是Map声明的一个内部接口,此接口为泛型,定义为Entry<K,V>。它表示Map中的一个实体(一个key-value对)

String key = null;
Integer value = null;
Iterator iter = myMap.entrySet().iterator();
while(iter.hasNext()) {
    Map.Entry entry = (Map.Entry)iter.next();
    key = (String)entry.getKey();
    value = (Integer)entry.getValue();
}

方法四:

通过values遍历(通过Map.values()遍历所有的value,但不能遍历key)

//使用迭代器
Integer value = null;
Collection c = myMap.values();
Iterator iter= c.iterator();
while (iter.hasNext()) {
    value = (Integer)iter.next();
}
//不适用迭代器
Collection c = myMap.values();
for (String v : c) {
    System.out.println("value= " + v);
   }

今日推歌

----《我爱你不问归期》

是想念如你温柔过境
才发现原来花开都有声音
只要你在我生命途径
再不怕时光匆匆如旅
是幸福在我耳际低语
才忘了寒风不曾停下足迹
直到我走遍半生四季
才懂得风景都不及你

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

星回昭以烂

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

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

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

打赏作者

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

抵扣说明:

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

余额充值