HarmonyOS 应用开发者高级认证编程练习题

HarmonyOS 应用开发者高级认证编程练习题

1、aaa...aa的和

有个整数a,大小在1到9之间。要算一个值s,它是由a、两个a组成的数、三个a组成的数……n个a组成的数,这样依次相加得到的,现在给你a和n的值,让你求s的值。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let numStr = inputArray[0].split(' ');
    let num = Number(numStr[0]);
    let count = Number(numStr[1]);
    
    let sum:number = 0;
    for(let i=1; i<=count; i++){
        let temp = 1;
        for(let j = 1;j<i;j++){
            temp *= 10;
        }
        sum += num*(count-i+1)*temp;
    }
    console.log(sum);
});

2、元素之和

给你一个数组,找出数组之中两个元素之和等于给定值的所有组合。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let numArray = inputArray[0].split(' ');
    let len = numArray.length;
    let num:number[] = new Array<number>(len);
    for(let i = 0;i <= len;i++){
        num[i] = Number(numArray[i]);
    }
    let str = "";
    let count = 0;
    for(let i = 0;i < len;i++){
        for(let j = i+1;j< len;j++){
            if(num[i] + num[j] == num[len-1]){
                if(count!=0){
                    str += " ";
                }
                str += num[i] + " " + num[j];
                count += 1;
            }
        }
    }
    if(count==0){
        console.log("NOEXIT");
    }else{
         console.log(str);
    }
    process.exit();
});

3、一比特字符

有两种特殊字符:
第一种字符可以用一比特 0 表示
第二种字符可以用两比特(10 或 11)表示
给你一个以 0 结尾的二进制数组 bits,将数组解析为比特字符,如果最后一个字符是一个一比特字符,则返回 TRUE 。
1 <= bits.length <= 1000

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let sumArray = inputArray[0].split(' ');
    
    let temp = 2;
    if(sumArray[sumArray.length] != '1'){
        for(let i = 0;i< sumArray.length;i++){
            if (temp == 1){
                temp = 2;
            }else if(sumArray[i] == '1'){
                temp = 1;
            }else if(sumArray[i] == '0'){
                temp = 0;
            }
        }
    }
    if (temp!=0){
        console.log("FALSE");
    }else{
        console.log("TRUE");
    }
    process.exit();
});

4、山脉数组

“山脉数组”:顾名思义,像山脉一样的数组,先严格递增后严格递减。现在给你一个整数数组,判断它是否为“山脉数组”。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let numArray = inputArray[0].split(' ');
    let flag = false;
    let isAdd = true;
    for(let i = 1;i<numArray.length;i++){
        if(isAdd){
            if(numArray[i]<numArray[i-1]){
                isAdd = false;
            }
        }else{
             if(numArray[i]>numArray[i-1]){
                isAdd = true;
                 break;
            }
        }
    }
    if(isAdd){
        console.log("FALSE");
    }else{
        console.log("TRUE");
    }
    process.exit();
});

5、计算数组特征值

给你一个长度为n的非负整数数组 nums 。如果存在一个数 x ,使得 nums 中恰好有 x 个元素 大于或者等于 x ,那么就称 nums 是一个特殊数组 ,而 x 是该数组的特征值 。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    
    let numArray = inputArray[0].trim().split(' ');
    let nums:number[] = new Array<number>(numArray.length);
    for(let i = 0;i <numArray.length;i++){
        nums[i] = Number(numArray[i]);
    }
    var sortNums = nums.sort();
    let flag = -1;
    for(let i = 0;i <sortNums.length;i++){
        if(sortNums[i]>=(sortNums.length - i)){
            if(i> 0 && sortNums[i - 1]>=(sortNums.length - i)){
                continue;
            }
            flag = sortNums.length - i;
            break;
        }
    }
    console.log(flag);
    process.exit();
});

6、找相同数对

输入为整数数组 data。如果两个下标 (i,j) 满足 data[i] == data[j] 且 i < j ,就认为是一组相同数对。请返回 data 数组包含的相同数对的数目。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    
    let numArray = inputArray[0].split(' ');
    let numMap = new Map();
    for(let i = 0;i< numArray.length;i++){
        let num = Number(numArray[i]);
        if (numMap.has(num)){
            numMap.set(num, numMap.get(num) + 1);
        }else{
            numMap.set(num, 1);
        }
    }
    let sum = 0;
    numMap.forEach((value, key) => { 
        if(value > 1){
            sum += value*(value-1)/2;
        }
    });
    console.log(sum);
    process.exit();
});

7、数组的距离

非严格递增的两个数组x[]和y[],请你计算两个数组的距离(两个数组元素之间差的绝对值中最小的一个)。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let numArray1 = inputArray[0].split(' ');
    let numArray2 = inputArray[1].split(' ');
    
    let len = Math.abs(Number(numArray1[0]) - Number(numArray2[0]));
    let num1,num2;
    for(let i=0,j=0;i<numArray1.length&&j<numArray2.length;){
        num1 = Number(numArray1[i]);
        num2 = Number(numArray2[j]);
        len = Math.min(len,  Math.abs(num1 - num2));
        if(num1 < num2){
            i++;
        }else{
            j++;
        }
    }
    console.log(len);
    process.exit();
});

8、寻找更大元素

给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});

process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let numberArray = inputArray[0].split('');
    let num:number[] = new Array(numberArray.length);
    for(let i = 0;i<numberArray.length;i++){
        num[i] = Number(numberArray[i]);
    }
    
    let index = numberArray.length - 2;
    while(index>=0&&num[index]>=num[index+1]){
        index--;
    }
    if(index<0){
        console.log(-1);
    }else{
        let i = numberArray.length - 1;
        while(i>=1&&num[i]< num[index]){
            i--;
        }
        [num[i], num[index]] = [num[index], num[i]];
        
        let left = index + 1,right = numberArray.length - 1;
        while(left<right){
            [num[left], num[right]] = [num[right], num[left]];
            left++;
            right--;
        }
        console.log(num.join(''));
    }
    process.exit();
});

9、学生出勤记录

给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤、迟到、到场)。记录中只含下面三种字符:
'A':Absent,缺勤
'L':Late,迟到
'P':Present,到场
如果学生能够 同时 满足下面两个条件,则可以获得出勤奖励:
1.按 总出勤 计,学生缺勤('A')严格 少于两天。
2.学生 不会 存在 3 天或 3 天以上的迟到('L')记录。
如果学生可以获得出勤奖励,返回 TRUE ;否则,返回 FALSE 。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let record = inputArray[0];
    let countA = 0;
    let countL = 0;
    let flag = false;
    for(let i = 0;i<record.length;i++){
        if(record[i]=='L'){
            countL += 1;
            if(countL == 3){
                flag = true;
                break;
            }
        }else{
             countL = 0;
            if(record[i] == 'A'){
                countA += 1;
                if(countA == 2){
                    flag = true;
                    break;
                }
            }
        }
    }
    if(flag){
        console.log('FALSE');
    }else{
        console.log('TRUE');
    }
    process.exit();
});

10、16进制转2进制

将输入的16进制数转换为2进制数并输出。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let numstr = inputArray[0].trim();
    let numMap: Map<string, string> = new Map([
      ['0', '0000'],
      ['1', '0001'],
      ['2', '0010'],
      ['3', '0011'],
      ['4', '0100'],
      ['5', '0101'],
      ['6', '0110'],
      ['7', '0111'],
      ['8', '1000'],
      ['9', '1001'],
      ['a', '1010'],
      ['b', '1011'],
      ['c', '1100'],
      ['d', '1101'],
      ['e', '1110'],
      ['f', '1111'],
    ]);
    let str='';
    for(let i = 2;i<numstr.length;i++){
        str += numMap.get(numstr[i]);
    }
    let strnum = '0b' + str.replace(/^0+/, '');
    console.log(strnum);
    process.exit();
});

11、最长递增数列

厂房有一批新箱子共n个(n<=500),箱子按照一定的顺序摆放。用一个正整数ai(1<=ai<=10000) (1<=i<=n)来表示第i个箱子的高度。现在华华要按照从前往后的顺序选出m个箱子(可以选任意一个箱子作为第一个),并且满足对任意的i < j 有 ai < aj. 那么m最大可以是多少呢?

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let sumArray = inputArray[0].split(' ');
    
    let dp = new Array(sumArray.length);
    let count = 0;
    let curNum;
    dp[0] = Number(sumArray[0]);
    for(let i = 1;i<sumArray.length;i++){
        curNum = Number(sumArray[i]);
        if(curNum>dp[count]){
            count++;
            dp[count] = curNum;
        }else{
            let left = 0,right = count,pos = 0;
            while(left <= right){
                let mid = (left + right)>>1;
                if(dp[mid]<curNum){
                    left = mid + 1;
                }else{
                    pos = mid;
                    right = mid - 1;
                }
            }
            dp[pos] = curNum;
        }
    }
    console.log(count+1);
    process.exit();
});

12、相反数

有N个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和-a为一对相反数)。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    
    let numArray = inputArray[0].split(' ');
    let numMap = new Map<number, number>();
    let count = 0;
    let num;
    for(let i = 0;i<numArray.length;i++){
        num = Number(numArray[i]);
        if(numMap.has(-num)){
            count++;
        }
        numMap.set(num, 1);
    }
    console.log(count);
    process.exit();
});

13、最多可做任务类型数

鸿蒙开发者有n个任务,其中第 i 个任务的类型为 taskType[i],由于时间限制,开发者只能完成 n / 2 (n 是一个偶数)个任务。
给定一个长度为 n 的正整数数组 taskType ,返回;开发者在只完成 n / 2 个任务的情况下,最多可以做多少种不同类型的任务。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let numArray = inputArray[0].split(' ');
    let numMap = new Map<number, number>();
    
    let num;
    for(let i = 0;i<numArray.length;i++){
        num = Number(numArray[i]);
        if(!numMap.has(num)){
            numMap.set(num,1);
        }
    }
    console.log(Math.min(numMap.size,numArray.length>>1));
    process.exit();
});

14、第几天

给一个日期(格式为年月日),判断这一天是这一年的第几天(提示:闰年和平年的二月天数不一样)。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let year = Number(inputArray[0].substr(0,4));
    let month = Number(inputArray[0].substr(5,2));
    let day = Number(inputArray[0].substr(8,2));
    let days:number[] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if(year%400 == 0 ||(year%4==0&&year%100!=0)){
        days[1] = days[1] + 1;
    }
    let count = 0;
    for(let i = 0;i<month-1;i++){
        count += days[i];
    }
    console.log(count + day);
    process.exit();
});

15、翻转字符串中的元音字母

给定一个字符串 s ,反转字符串中的所有元音字母(a,e,i,o,u)的顺序,并返回反转后的结果。即获取字符串中所有的元音字母,元音字母逆序后,再放回原字符串,保持辅音字母的顺序不变。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let strTemp = inputArray[0].split('');
    let len = strTemp.length;
    let left = 0,right = len-1;
    
    let map = new Map([
        ['a',1],
        ['e',1],
        ['i',1],
        ['o',1],
        ['u',1],
    ]);
    
    let temp;
    let leftFlag = false, rightFlag = false;
    while(left<right){
        if(!leftFlag){
            if(!map.has(strTemp[left])){
                left++;
            }else{
                leftFlag = true;
            }
        }
        if(!rightFlag){
            if(!map.has(strTemp[right])){
                right--;
            }else{
                rightFlag = true;
            }
        }
        if(leftFlag&&rightFlag){
            temp = strTemp[left];
            strTemp[left] = strTemp[right];
            strTemp[right] = temp;
            leftFlag = false;
            rightFlag = false;
            left++;
            right--;
        }
    }
    console.log(strTemp.join(''));
    process.exit();
});

16、交替位二进制数

给定一个正整数n检查它的二进制表示是否总是 0、1 交替出现:换句话说,就是二进制表示中相邻两位的数字永不相同。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let num = Number(inputArray[0]);
    
    let result = true;
    let flag = (num % 2 === 0);
    while(num!=0){
        num = num>>1;
        if(flag == (num % 2 === 0)){
            result = false;
            break;
        }else{
            flag = !flag;
        }
    }
    if(result){
        console.log("TRUE");
    }else{
        console.log("FALSE");
    }
    process.exit();
});

17、存在重复元素

给你一个长度为n的非负整数数组 nums 。如果任一值在数组中出现至少两次 ,返回 TRUE ;如果数组中每个元素互不相同,返回 FALSE 。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let numArray = inputArray[0].split(' ');
    let map = new Map<number,number>();
    let num,flag = false;
    for(let i = 0;i< numArray.length;i++){
        num = Number(numArray[i]);
        if(map.has(num)){
            flag = true;
        }else{
            map.set(num,1);
        }
    }
    if(flag){
        console.log("TRUE");
    }else{
        console.log("FALSE");
    }
    process.exit();
});

18、元音字母

你是一个英语爱好者,尤其是对元音字母敏感。现在给你一个字符串,你来判断其中元音字母(A/a、E/e、I/i、O/o、U/u)的出现次数,并分别输出每个字母出现的次数。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let map = new Map([
       ['a',0] ,
       ['e',1] ,
       ['i',2] ,
       ['o',3] ,
       ['u',4] ,
       ['A',0] ,
       ['E',1] ,
       ['I',2] ,
       ['O',3] ,
       ['U',4] ,
    ]);
    let result:number[] = [0,0,0,0,0];
    let num;
    for(let i=0;i<inputArray[0].length;i++){
        num = inputArray[0][i];
        if(map.has(num)){
            result[map.get(num)] = result[map.get(num)] + 1;
        }
    }
    console.log(result.join(' '));
    process.exit();
});

19、不区分大小写对字符串进行排序

不区分大小写对字符串进行排序(按AaBbCcDd...顺序排序,且大写字母在小写字母前)
如:BadbAbB不区分大小写排序是AaBBbbd

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let charArray = inputArray[0].split('');
    let sorrtedArray:string[] = charArray.sort((n1,n2)=> {
        let index1 = n1.toLowerCase().charCodeAt(0);
        let index2 = n2.toLowerCase().charCodeAt(0);
        
        if(index1 == index2){
            return n1.charCodeAt(0) - n2.charCodeAt(0);
        }else{
            return index1 - index2;
        }
    });
    console.log(charArray.join(''));
    process.exit();
});

20、完全数

完全数的意思是一个数等于它的所有真约数之和。现在给你一个整数,请你判断一下这个整数是否为完全数。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let num = Number(inputArray[0]);
    
    if(num == 6||num == 28||num == 496){
        console.log("TRUE");
    }else{
        console.log("FALSE");
    }
    process.exit();
});

21、字符排序

给定一个字符串,仅含英文字母和数字,请按如下规则对其进行排序:
排序后,原位置是数字的,排序后仍然是数字;原位置是字母的,排序后仍然是字母。
数字:按 0-9 升序。
英文字母:大写字母大于小写字母,小写字母按 a-z 升序,大写字母按 A-Z 升序。

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
});
process.stdin.on('end', () => {
    let inputArray = input.split('\n');
    let charArray = inputArray[0].split('');
    let charMap = new Map();
    for(let i = 0;i<charArray.length;i++){
        if(charMap.has(charArray[i])){
            charMap.set(charArray[i], charMap.get(charArray[i])+1);
        }else{
            charMap.set(charArray[i], 1);
        }
    }
    let indexlow = 'a';
    let indexnum = '0';
    let indexhigh = 'A';
    for(let i = 0;i<charArray.length;i++){
        if(!isNaN(Number(charArray[i]))){
            while(true){
                if(charMap.has(indexnum)){
                    let count = charMap.get(indexnum);
                    if(count == 1){
                        charMap.delete(indexnum);
                    }else{
                        charMap.set(indexnum, count - 1);
                    }
                    charArray[i] = indexnum;
                    break;
                }else{
                    indexnum = String.fromCharCode(indexnum.charCodeAt(0) + 1);
                }
            }
        }else{
            while(true){
                if(indexlow.charCodeAt(0) <= 'z'.charCodeAt(0)){
                    if(charMap.has(indexlow)){
                        let count = charMap.get(indexlow);
                        if(count == 1){
                            charMap.delete(indexlow);
                        }else{
                            charMap.set(indexlow, count - 1);
                        }
                        charArray[i] = indexlow;
                        break;
                    }else{
                        indexlow = String.fromCharCode(indexlow.charCodeAt(0) + 1);
                    }
                }else{
                    if(charMap.has(indexhigh)){
                        let count = charMap.get(indexhigh);
                        if(count == 1){
                            charMap.delete(indexhigh);
                        }else{
                            charMap.set(indexhigh, count - 1);
                        }
                        charArray[i] = indexhigh;
                        break;
                    }else{
                        indexhigh = String.fromCharCode(indexhigh.charCodeAt(0) + 1);
                    }
                }
                
            }
        }
    }
    console.log(charArray.join(''));
    process.exit();
});
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容