算法竞赛一些基础问题的复习(java) 2(开灯问题、蛇形填数、TEX、wertyu)

13 篇文章 0 订阅

(这些是一个月前写的了,忘了发了。。。)网上搜了一下,完整整理这些题的貌似只有c的,我还是继续用java吧。
1.开灯问题。有n盏灯,编号为1~n。第1个人把所有灯打开,第2个人按下所有编号为2 的倍数的开关(这些灯将被关掉),第3个人按下所有编号为3的倍数的开关(其中关掉的灯 将被打开,开着的灯将被关闭),依此类推。一共有k个人,问最后有哪些灯开着?输 入n和k,输出开着的灯的编号。k≤n≤1000

    static boolean[] a = new boolean[1005];//为了保险,设为1005,貌似java里!不能给int数组取反,所以new一个布尔数组
    public static void main(String[] args) {
        Arrays.fill(a,false);
        int n, k, f = 1;// f为判断是否是第一个输出数据,在同行输出时,可不打印行头空格
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        k = sc.nextInt();
        for (int i = 1; i <= k; i++) {//进来的人逐个循环
            for (int j = 1; j <= n; j++) {//灯泡循环
                if (j % i == 0) {
                    a[j]=!a[j];//取反
                }
            }
        }
        for (int i = 1; i <= n; i++) {
            if (a[i]) {
                if (f == 1) {
                    f = 0;
                } else {
                    System.out.printf(" ");
                }
                System.out.print(i);
            }
        }
    }
    //备忘另外java中赋值数组的方法:System.arraycopy(源数组, 复制源起始位置, 目标数组, 目标起始位置,复制长度)  

2.蛇形填数。在n×n方阵里填入1,2,…,n×n,要求填成蛇形,n<=8。例如,n=4时方阵为:这里写图片描述

        int n, i, j, num;//输入数,行数,列数,填充数
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        int a[][] = new int[n][n];
        for (i = 0; i < n; i++)
            Arrays.fill(a[i], 0);//二维数组好像不能统一赋值,最少也得一个循环
        num = a[i = 0][j = n - 1] = 1;//右上角的1
        while (num < n * n) {
            while (i + 1 < n && a[i + 1][j] == 0)//向下
                a[++i][j] = ++num;
            while (j - 1 >= 0 && a[i][j - 1] == 0)//向左
                a[i][--j] = ++num;
            while (i - 1 >= 0 && a[i - 1][j] == 0)//向上
                a[--i][j] = ++num;
            while (j + 1 < n && a[i][j + 1] == 0)//向右
                a[i][++j] = ++num;
        }
        for (i = 0; i < n; i++) {
            for (j = 0; j < n; j++) {
                System.out.print(" " + a[i][j]);
            }
            System.out.println();
        }

3.TeX中的引号(Tex Quotes, UVa 272)
在TeX中,左双引号是““”,右双引号是“””。输入一篇包含双引号的文章,你的任务是 把它转换成TeX的格式。

        boolean is = true;//按顺序标识左右引号
        Scanner sc = new Scanner(System.in);
        String in = sc.nextLine();
        char[] a = in.toCharArray();
        for (int i = 0; i < in.length(); i++) {
            if (a[i] == '"') {
                if (is) {
                    a[i] = '”';
                } else {
                    a[i] = '“';
                }
                is = !is;
                System.out.print(a[i]);
            } else
                System.out.print(a[i]);
        }
//这其实是一个并不完善的程序,因为它并不能解决输入的文本中存在回车的情况,至于怎么解决,我也不知道。。。

4.WERTYU(WERTYU, UVa10082)
把手放在键盘上时,稍不注意就会往右错一 位。这样,输入Q会变成输入W,输入J会变成输 入K等。

        String r = "`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./";//貌似常量数组是最简单的方法了。。
        char[] right=r.toCharArray();//转化成常量数组
        Scanner sc = new Scanner(System.in);
        char[] w=sc.nextLine().toCharArray();
        for (int i = 0; i < w.length; i++) {
            for(int j=0;j<right.length;j++){
                if (w[i] == right[j]) {System.out.print(right[j-1]);break;}//输出该字符在正确数组里的前一位
                else if(w[i] == ' ') {System.out.print(' ');break;}//出现的空格情况
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值