华为OJ初级1-10

1. 字符串最后一个单词的长度

计算字符串最后一个单词的长度,单词以空格隔开。
知识点 字符串,循环
运行时间限制 0M
内存限制 0
输入
一行字符串,长度小于128。
输出
整数N,最后一个单词的长度。
样例输入 hello world
样例输出 5

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String tmpStr =  sc.nextLine();
            String[] arr = tmpStr.split(" ");
            System.out.println(arr[arr.length - 1].length());
        }
        sc.close();
    }
}

2.合唱队

计算最少出列多少位同学,使得剩下的同学排成合唱队形
说明:
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足存在i(1<=i<=K)使得Ti<T2<......<Ti-1<Ti>Ti+1>......>TK。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
知识点 循环
运行时间限制 0M
内存限制 0
输入
整数N
一行整数,空格隔开,N位同学身高
输出
最少需要几位同学出列
样例输入 8 186 186 150 200 160 130 197 200
样例输出 4

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int n = sc.nextInt();
            int[] arr = new int[n];
            for(int i = 0;i < n;i++){
                arr[i] = sc.nextInt();
            }
            
            int[] inc = new int[n];
            inc[0] = 1;
            for(int i = 1;i < n;i ++){
                inc[i] = 1;
                for(int j = 0;j < i;j ++){
                    if(arr[j] < arr[i] && inc[j] + 1 > inc[i]){
                        inc[i] = inc[j] + 1;
                    }
                }
            }
            
            int[] des = new int[n];
            des[n - 1] = 1;
            for(int i = n -2;i >=0;i --){
                des[i] = 1;
                for(int j = n - 1;j > i;j --){
                    if(arr[j] < arr[i] && des[j] + 1 > des[i]){
                        des[i] = des[j] + 1;
                    }
                }
            }
            
            int max = 0;
            for(int i = 0;i < n;i ++){
                if(inc[i] + des[i] - 1> max){
                    max = inc[i] + des[i] - 1;
                }
            }
            
            System.out.println(n - max);
        }
        sc.close();
    }
}

3.图片整理

Lily上课时使用字母数字图片教小朋友们学习英语单词,每次都需要把这些图片按照大小(ASCII码值从小到大)排列收好。请大家给Lily帮忙,通过C语言解决。
知识点 字符串
运行时间限制 0M
内存限制 0
输入
Lily使用的图片包括"A"到"Z"、"a"到"z"、"0"到"9"。输入字母或数字个数不超过1024。
输出
Lily的所有图片按照从小到大的顺序输出
样例输入 Ihave1nose2hands10fingers
样例输出 0112Iaadeeefghhinnnorsssv

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()){
            String str =  sc.nextLine();
            char[] chs = str.toCharArray();
            Arrays.sort(chs);
            System.out.println(chs);
        }
        sc.close();
    }
}

4.名字的漂亮度

给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
知识点 字符串
运行时间限制 0M
内存限制 0
输入
整数N,后续N个名字
N个字符串,每个表示一个名字
输出
每个名称可能的最大漂亮程度
样例输入 2 zhangsan lisi
样例输出 192 101

import java.util.Scanner;
import java.util.Arrays;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextInt()){
            int cnt = Integer.parseInt(sc.nextLine());
            int[] nums = new int[cnt];
            for(int j= 0;j < cnt;j++){
            String str = sc.nextLine().toUpperCase();
            int[] ints = new int[26];
            for(int i = 0;i < str.length();i++){
                ints[str.charAt(i) - 'A'] ++;
            }
            Arrays.sort(ints);
            int result = 0;
            for(int i = 0;i < 26;i++)
                result += (i+1)*ints[i];
            nums[j] = result;
            }
            for(int i = 0;i < cnt;i++)
                System.out.println(nums[i]);
        }
        sc.close();
    }
}

5.(练习用)挑7

输出7有关数字的个数,包括7的倍数,还有包含7的数字(如17,27,37...70,71,72,73...)的个数
知识点 循环
运行时间限制 0M
内存限制 0
输入
一个正整数N。(N不大于30000)
输出
不大于N的与7有关的数字个数,例如输入20,与7有关的数字包括7,14,17.
样例输入 20
样例输出 3

import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int N = sc.nextInt();
            int sum = 0;
            for(int i = 1;i <= N;i ++){
                if(i % 7 == 0 || String.valueOf(i).toString().contains("7")) {
                    sum ++;
                }
            }
            System.out.println(sum);
        }
        sc.close();
    }
}

6.字符串加解密

题目描述
1、对输入的字符串进行加解密,并输出。
2加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
3、解密方法为加密的逆过程。
接口描述:
实现接口,每个接口实现1个基本操作:
void Encrypt (char aucPassword[], char aucResult[]):在该函数中实现字符串加密并输出
说明:
1、字符串以\0结尾。
2、字符串最长100个字符。
int unEncrypt (char result[], char password[]):在该函数中实现字符串解密并输出
说明:
1、字符串以\0结尾。
2、字符串最长100个字符。
知识点 字符串
运行时间限制 10M
内存限制 128
输入
输入说明
输入一串要加密的密码
输入一串加过密的密码
输出
输出说明
输出加密后的字符
输出解密后的字符
样例输入 abcdefg BCDEFGH
样例输出 BCDEFGH abcdefg

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str1 = sc.next();
            String str2 = sc.next();

            char aucPassword[] = str1.toCharArray();
            char aucResult[] = new char[aucPassword.length];
            Encrypt(aucPassword, aucResult);
            System.out.println(aucResult);

            char result[] = str2.toCharArray();
            char password[] = new char[result.length];
            unEncrypt(result, password);
            System.out.println(password);
        }
        sc.close();

    }

    public static void Encrypt(char aucPassword[], char aucResult[]) {
        for (int i = 0; i < aucPassword.length; i++) {
            char c = aucPassword[i];
            if (c >= 'a' & c <= 'z') {
                aucResult[i] = (char) ((c + 1 - 'a') % 26 + 'A');
            }
            if (c >= 'A' & c <= 'Z') {
                aucResult[i] = (char) ((c + 1 - 'A') % 26 + 'a');
            }
            if (c >= '0' & c <= '9') {
                aucResult[i] = (char) ((c + 1 - '0') % 10 + '0');
            }
        }
    }

    public static int unEncrypt(char result[], char password[]) {
        for (int i = 0; i < result.length; i++) {
            char c = result[i];
            if (c >= 'a' & c <= 'z') {
                password[i] = (char) ((26 + c - 1 - 'a') % 26 + 'A');
            }
            if (c >= 'A' & c <= 'Z') {
                password[i] = (char) ((26 + c - 1 - 'A') % 26 + 'a');
            }
            if (c >= '0' & c <= '9') {
                password[i] = (char) ((10 + c - 1 - '0') % 10 + '0');
            }
        }
        return 0;
    }
}

7.蛇形矩阵

蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。
样例输入
5
样例输出
1 3 6 10 15
2 5 9 14
4 8 13
7 12
11
接口说明
原型
void GetResult(int Num, char * pResult);
输入参数:
int Num:输入的正整数N
输出参数:
int * pResult:指向存放蛇形矩阵的字符串指针
指针指向的内存区域保证有效
返回值:
void
知识点 数组
运行时间限制 10M
内存限制 128
输入
输入正整数N(N不大于100)
输出
输出一个N行的蛇形矩阵。
样例输入 4
样例输出 1 3 6 10 2 5 9 4 8 7

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int sum = n * (n + 1) / 2;
            int rowStart = 1;
            for (int i = 1; i <= n; i++) {
                rowStart = 1 + i * (i - 1) / 2;
                System.out.print(rowStart);
                int tmp = 1 + i;
                rowStart += tmp;
                while (rowStart <= sum) {
                    System.out.print(" " + rowStart);
                    tmp++;
                    rowStart += tmp;
                }
                System.out.println();
            }
        }
    }
}

8.字符串加密

有一种技巧可以对数据进行加密,它使用一个单词作为它的密匙。下面是它的工作原理:首先,选择一个单词作为密匙,如TRAILBLAZERS。如果单词中包含有重复的字母,只保留第1个,其余几个丢弃。现在,修改过的那个单词死于字母表的下面,如下所示:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
T R A I L B Z E S C D F G H J K M N O P Q U V W X Y
上面其他用字母表中剩余的字母填充完整。在对信息进行加密时,信息中的每个字母被固定于顶上那行,并用下面那行的对应字母一一取代原文的字母(字母字符的大小写状态应该保留)。因此,使用这个密匙,Attack AT DAWN(黎明时攻击)就会被加密为Tpptad TP ITVH。
请实现下述接口,通过指定的密匙和明文得到密文。
详细描述:
接口说明
原型:
voidencrypt(char * key,char * data,char * encrypt);
输入参数:
char * key:密匙
char * data:明文
输出参数:
char * encrypt:密文
返回值:
void
知识点 字符串
运行时间限制 10M
内存限制 128
输入
先输入key和要加密的字符串
输出
返回加密后的字符串
样例输入 nihao ni
样例输出 le

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) {
            String key = sc.nextLine();
            String data = sc.nextLine();
            char[] result = encrypt(key, data);
            System.out.println(result);
        }
    }

    public static char[] encrypt(String key, String data) {
        key = key.toUpperCase();
        String keyDic = "";
        for (int i = 0; i < key.length(); i++) {
            char c = key.charAt(i);
            if (!keyDic.contains(String.valueOf(c)))
                keyDic += c;
        }
        for (int i = 0; i < 26; i++) {
            char c = (char) ('A' + i);
            if (!keyDic.contains(String.valueOf(c)))
                keyDic += c;
        }
        char[] result = data.toCharArray();
        for (int i = 0; i < data.length(); i++) {
            char c = data.charAt(i);
            if (c >= 'A' && c <= 'Z')
                result[i] = (char) (keyDic.charAt(c - 'A'));
            if (c >= 'a' && c <= 'z')
                result[i] = (char) (keyDic.charAt(c - 'a') - 'A' + 'a');
        }
        return result;
    }
}

9. 公共字串计算

题目标题:
计算两个字符串的最大公共字串的长度,字符不区分大小写
详细描述:
接口说明
原型:
int getCommonStrLength(char * pFirstStr, char * pSecondStr);
输入参数:
char * pFirstStr //第一个字符串
char * pSecondStr//第二个字符串
知识点 字符串,查找
运行时间限制 10M
内存限制 128
输入
输入两个字符串
输出
输出一个整数
样例输入 asdfas werasdfaswer
样例输出 6

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str1 = sc.next();
            String str2 = sc.next();
            int len = str1.length();
            int result = 0;
            for (int i = 0; i < len; i++) {
                for (int j = 0; j <= i; j++) {
                    String subStr = str1.substring(j, j + len - i);
                    if (str2.contains(subStr)) {
                        result = len - i;
                        break;
                    }
                }
                if (result > 0)
                    break;
            }
            System.out.println(result);
        }
        sc.close();
    }
}

10. 多线程

问题描述:有4个线程和1个公共的字符数组。线程1的功能就是向数组输出A,线程2的功能就是向字符输出B,线程3的功能就是向数组输出C,线程4的功能就是向数组输出D。要求按顺序向数组赋值ABCDABCDABCD,ABCD的个数由线程函数1的参数指定。[注:C语言选手可使用WINDOWS SDK库函数]
接口说明:
void init(); //初始化函数
void Release(); //资源释放函数
unsignedint__stdcall ThreadFun1(PVOID pM) ; //线程函数1,传入一个int类型的指针[取值范围:1 – 250,测试用例保证],用于初始化输出A次数,资源需要线程释放
unsignedint__stdcall ThreadFun2(PVOID pM) ;//线程函数2,无参数传入
unsignedint__stdcall ThreadFun3(PVOID pM) ;//线程函数3,无参数传入
Unsigned int __stdcall ThreadFunc4(PVOID pM);//线程函数4,无参数传入
char g_write[1032]; //线程1,2,3,4按顺序向该数组赋值。不用考虑数组是否越界,测试用例保证
知识点 字符串,循环,链表,队列,栈,查找,搜索,排序,树,图,数组,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制 10M
内存限制 128
输入
输入一个int整数
输出
输出多个ABCD
样例输入 10
样例输出 ABCDABCDABCDABCDABCDABCDABCDABCDABCDABCD

import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            long start = System.currentTimeMillis();
            int n = sc.nextInt();
            for (int i = 0; i < n; i++) {
                // System.out.print("ABCD");
                for (int j = 0; j < 4; j++) {
                    Thread t = new MyThread((char) ('A' + j));
                    t.start();
                    t.join();
                }
            }
            System.out.println();
            long end = System.currentTimeMillis();
            System.out.println(end - start);
        }
    }
}

class MyThread extends Thread {
    private char c;

    public MyThread(char c) {
        this.c = c;
    }

    @Override
    public void run() {
        System.out.print(c);
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容