Java测试:OJ练习(字符串合并后返回按照先后顺序排列的不重复新字符串、合并数组并按升序排列、Arrays 类中的sort方法)

news2024/11/24 17:34:11

1、给定一个长度为n的字符 串,字符串中只包含大小写字母。 请你返回该字符串拥有那些字符。
并将它们按照出现的先后!顺序拼接成一个新的字符串。

这是我最开始写的,代码有点问题:

public String setString(String str) {
    char[] array = str.toCharArray();
    char[] arr = new char[52];
    char[] arrHelp = new char[52];

    for (int i = 0; i < array.length; i++) {
        if ((array[i] >= 'A' && array[i] <= 'Z') && arrHelp[array[i] - 'A'] == 0) {
            arr[i] = array[i];
            arrHelp[array[i] - 'A'] = '1';
        } else if ((array[i] >= 'a' && array[i] <= 'z') && arrHelp[array[i] - 'a' + 26] == 0) {
            arr[i] = array[i];
            arrHelp[array[i] - 'a' + 26] = '1';
        }
    }

    String result = new String(arr);
    return result;
}

自测输入“BAabB”,预期输出“BAab”,实际输出“BAab,怎么回事?

在之前的代码中,使用了错误的索引 i 来赋值 arr[i],这会导致字符存储位置出现问题。通过引入 index 变量,我们确保只在正确的位置存储有效字符,并保持了字符出现的先后顺序。

在修正后的代码中,我们引入了一个名为 index 的额外变量来追踪有效字符的索引位置。初始值为0,每当遇到一个有效字符时,将其存储在 arr 数组中,并递增 index 的值。

最后,在创建新的字符串对象时,使用 new String(arr, 0, index) 来指定从 arr 数组的索引0开始,一直到有效字符的索引位置 index 结束。这样可以保证生成的字符串只包含有效字符,而不包含未赋值的部分。

通过以上修正,代码将按照预期的方式处理输入字符串,并返回正确的结果 "BAab"。

public String setString(String str) {
    char[] array = str.toCharArray();
    char[] arr = new char[52];
    char[] arrHelp = new char[52];

    int index = 0; // 追踪有效字符的索引

    for (int i = 0; i < array.length; i++) {
        if ((array[i] >= 'A' && array[i] <= 'Z') && arrHelp[array[i] - 'A'] == 0) {
            arr[index++] = array[i]; // 使用 index 来赋值有效字符,并递增索引
            arrHelp[array[i] - 'A'] = '1';
        } else if ((array[i] >= 'a' && array[i] <= 'z') && arrHelp[array[i] - 'a' + 26] == 0) {
            arr[index++] = array[i]; // 使用 index 来赋值有效字符,并递增索引
            arrHelp[array[i] - 'a' + 26] = '1';
        }
    }

    String result = new String(arr, 0, index); // 根据有效字符的索引创建新的字符串
    return result;
}

感觉这个方法笨笨的,有没有更聪明的做法?

我们需要先来了解字符串的一个方法contains():

contains方法用于检查一个字符串是否包含另一个字符串。

方法签名:

public boolean contains(CharSequence sequence)

 参数sequence是CharSequence类型,可以传递一个字符串或字符序列作为参数。contains方法返回一个布尔值,表示调用方法的字符串是否包含传递的字符串或字符序列。

String str = "Hello, World!";
boolean containsWorld = str.contains("World"); // 检查str是否包含"World"
System.out.println(containsWorld); // 输出: true

boolean containsGoodbye = str.contains("Goodbye"); // 检查str是否包含"Goodbye"
System.out.println(containsGoodbye); // 输出: false

需要注意的是,contains方法区分大小写。如果需要进行不区分大小写的比较,可以先将字符串转换为小写或大写形式,然后再使用contains方法进行判断。

好了,那么接下来这个问题就很好解决了: 

    public static String func1(String str){
        String s="";
        for(int i=0;i<str.length();i++){
            char ch =str.charAt(i);
            if(!s.contains(ch+"")){
                s+=ch;
            }
        }
        return s;
    }

    //效率太低了!用StringBuider

    public static String func2(String str){
        StringBuilder stringBuilder=new StringBuilder();
        for(int i=0;i<str.length();i++){
            char ch =str.charAt(i);
            if(stringBuilder.indexOf(ch+"")<0){
                stringBuilder.append(ch);
            }
        }
        return stringBuilder.toString();
    }

2、给出一个有序的整数数组A和有序的整数数组B,请将数组B合并到数组A中,变成一个有序的升序数组

数据范围:0≤n,m≤100, Ai<=100 Bi| <= 100

注意:

  • 1.保证A数组有足够的空间存放B数组的元素,A和B中初始的元素数目分别为m和n,A的数组空间大小为m+n
  • 2.不要返回合并的数组,将数组B的数据合并到A里面就好了,且后台会自动将合并后的数组A的内容打印出来,所以也不需要自己打印
  • 3.A数组在[0,m-1]的范围也是有序的。
public void mergeArrays(int[] A, int m, int[] B, int n) {
    int indexA = m - 1; // A数组的末尾索引
    int indexB = n - 1; // B数组的末尾索引
    int mergeIndex = m + n - 1; // 合并后数组的末尾索引

    // 从后往前遍历,将较大的元素从后往前依次放入合并后的数组中
    while (indexA >= 0 && indexB >= 0) {
        if (A[indexA] >= B[indexB]) {
            A[mergeIndex] = A[indexA];
            indexA--;
        } else {
            A[mergeIndex] = B[indexB];
            indexB--;
        }
        mergeIndex--;
    }

    // 如果B数组还有剩余元素,将其依次放入合并后的数组中
    while (indexB >= 0) {
        A[mergeIndex] = B[indexB];
        indexB--;
        mergeIndex--;
    }
}

这里要注意!A[ ] 和 B[ ] 本来就已经按照升序排放好了。

当然,这里也可以选择 可以使用 java.util.Arrays 类中的sort方法。

以下是sort方法的签名:

public static void sort(int[] array)

该方法接受一个整数类型的数组作为参数,并按升序对数组进行排序。排序后,数组中的元素将按照从小到大的顺序排列。

举个例子:

import java.util.Arrays;

public class ArraySortExample {
    public static void main(String[] args) {
        int[] array = {5, 2, 8, 1, 9, 3};

        // 对数组进行排序
        Arrays.sort(array);

        // 输出排序后的数组
        for (int num : array) {
            System.out.print(num + " ");
        }
    }
}

运行以上代码将输出:1 2 3 5 8 9,表示数组中的元素已按升序排列。

需要注意的是,sort方法默认按升序对数组进行排序。如果需要按降序排序,可以使用Arrays.sort方法的重载版本,传递一个Comparator对象作为第二个参数,以指定自定义的排序顺序。

Comparator是一个函数式接口,用于定义比较两个对象的规则。

Comparator接口中有一个compare方法,用于比较两个对象的顺序。返回值为负数表示第一个对象应该排在前面,返回值为正数表示第二个对象应该排在前面,返回值为零表示两个对象相等。

import java.util.Arrays;
import java.util.Comparator;

public class CustomSortingExample {
    public static void main(String[] args) {
        String[] fruits = {"Apple", "Orange", "Banana", "Mango"};

        // 使用自定义的Comparator对象进行排序
        Arrays.sort(fruits, new LengthComparator());

        // 输出排序后的水果数组
        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }

    // 自定义的Comparator对象,根据字符串长度进行比较
    static class LengthComparator implements Comparator<String> {
        @Override
        public int compare(String s1, String s2) {
            return s1.length() - s2.length();
        }
    }
}

 在上述示例中,我们定义了一个字符串数组fruits,包含一些水果名称。然后,我们创建了一个名为 LengthComparator 的内部类,实现了Comparator<String>接口。在LengthComparator中,我们通过比较字符串长度来定义自定义的排序顺序。

在main方法中,我们使用 Arrays.sort 方法并传递 fruits 数组和 LengthComparator 对象作为参数进行排序。排序后,我们遍历输出排序后的水果数组。

运行以上代码将按照字符串长度进行升序排序输出水果数组。

通过实现自定义的Comparator对象,我们可以根据需要定义不同的排序规则来满足特定的排序需求。

3、关于以下程序代码的说明正确的是(  )

A.程序通过编译,输出结果为:x=102

B.程序通过编译,输出结果为:x=103

C.10行不能通过编译.因为x星私有静态变量

D.5行不能通过编译.因为引用了私有静态变量

 public class HasStatic {// 1
	private static int x = 100;// 2
	public static void main(String args[]) {// 3
		HasStatic hsl = new HasStatic();// 4
		hsl.x++;// 5
		HasStatic hs2 = new HasStatic();// 6
		hs2.x++;// 7
		hsl = new HasStatic();// 8
		hsl.x++;// 9
		HasStatic.x--;// 10
		System.out.println(" x=" + x);// 11
	}
}
  1. 本题中的静态成员变量x,属于类变量,只有一份。所有对x的操作针对的都是同一份。
  2. 静态成员变量的访问需要通过类名访问,这是正确的访问方式。本题中虽然使用了对象引用访问,但是不会报错,我们不建议这样访问,但不是错误,所以,不会编译报错。

综合以上2点,得出结论:本题可以正常通过编译和运行,输出结果是102。

答案:A

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/530283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文本三剑客之——Awk

Awk Awk简介Awk语法格式Awk常见内置变量Awk实例演示按行输出文本BEGIN模式和END模式按字段输出文本通过管道&#xff0c;双引号调用shell命令date 的用法getline的用法awk数组 Awk简介 Awk是一个功能强大的编辑工具&#xff0c;用于在Linux/UNIX 下对文本和数据进行处理。数据…

代码随想录算法训练营第六天|242.有效的字母异位词 、349. 两个数组的交集 、202. 快乐数、1. 两数之和

哈希表的表示方式&#xff1a;数组、set、map 数组&#xff1a;范围可控的情况下&#xff0c;可以用数组 set&#xff1a;哈希值较大的情况下&#xff0c;或数值分布很分散的情况 map&#xff1a;key 和 value对应的情况下 能用数组尽量用数组&#xff0c;因为数组会比较快&…

Netty内存管理

关键概念 PoolArena——内存管理的统筹者 PoolArena是内存管理的统筹者。它内部有一个PoolChunkList组成的链表 PoolChunkList——对PoolChunk的管理 PoolChunkList内部有一个PoolChunk组成的链表。通常一个PoolChunkList中的所有PoolChunk使用率(已分配内存/ChunkSize)都在…

机器学习算法分类

机器学习常用算法的分类&#xff1a; 根据数据集组成不同&#xff0c;可以把机器学习算法分为&#xff1a; 监督学习无监督学习半监督学习强化学习 1、监督学习 - 定义&#xff1a; - 输入数据是由输入特征值和目标值所组成 - 函数的输出可以是一个连续的值&#xff08;称为回…

【文本三剑客】AWK

AWK 一、AWK的工作原理1.1命令格式1.2awk常见的内建变量 二、awk实验2.1按行输入文本2.2按字段输出文本2.3通过管道符、双引号调用shell命令 一、AWK的工作原理 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&…

银行数字化转型导师坚鹏:银行数字化转型面临的5大机遇与4大挑战

在机遇方面&#xff0c;主要面临以下5大机遇&#xff1a; 国家战略及政策机遇&#xff1a;乡村振兴战略、制造强国战略、绿色金融战略等战略的落实将会给银行数字化转型带来新的业务机遇&#xff0c;《中国银保监会关于推动银行业和保险业高质量发展的指导意见》、《关于银行业…

第五章 面向对象-4abstract抽象

1.4 abstract class抽象类 声明抽象类&#xff0c;使用关键字abstract //内部匿名类 Db db new Db(){ };3.了解抽象类 抽象方法 AbstractClassMain.java /** Copyright (c) 2017, 2023, zxy.cn All rights reserved.**/ package cn.practice2;/*** <p>Description:&…

Chatgpt中文版无需代理,ChatGPT镜像

Chatgpt中文版无需代理 网站ChatGPT中文版 ChatGPT中文版是一个基于人工智能技术的聊天机器人&#xff0c;它可以模拟人类的自然语言交互&#xff0c;回答用户的各种问题和提供各种服务。它的核心技术是GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型&am…

基础:Android相关基础知识

目录 1.Android 四大组件 2.Activity生命周期 3.Service的生命周期 4.Service的启动方式 5.Activity的启动模式 6.广播的分类 7.ANR是什么&#xff0c;怎么避免&#xff1f; 8.Handler消息处理机制 9.事件分发机制 10.View绘制流程 11.Binder机制 12.进程间通信 1…

2023最新一键开通主机免费源码

更新了ui 自助开通主机&#xff0c;自己修改服务器 不带接口&#xff0c;不带接口&#xff0c;不带接口 打开api.php文件&#xff0c;把8.8.8.8改服务器ip&#xff0c;123456改成你的密钥 前往我的技术博客查看更多https://202271.xyz/?zhuji 蓝奏云链接 https://wwp.lanz…

如何在Linux中显示网络连接、路由表、接口统计等信息?Netstat了解一下!

Netstat 是一个用于显示网络连接、路由表、接口统计等信息的命令行工具。它在 Linux 和其他类 Unix 系统中都有提供&#xff0c;可以帮助我们分析和诊断网络问题。本文将介绍 Netstat 命令的基本用法和常见选项。 Netstat 命令的语法 Netstat 命令的基本语法如下&#xff1a; …

rtl仿真器-ghdl安装和测试

安装 sudo add-apt-repository ppa:pgavin/ghdl sudo apt-get update sudo apt-get install ghdl gtkwave仿真 rtl add.v library ieee; use ieee.std_logic_1164.all; entity ADD is port (A,B:in bit; SUM,CARRY:out bit); end entity ADD; architecture behave of ADD i…

前端部署vue项目到腾讯云服务器

先把dist包上传服务器 可以使用宝塔、FileZilla、手动上传等等方式 已有腾讯云服务器之后进入面板界面 然后安装Nginx 请一步一步&#xff0c;紧跟步骤 第一步 安装gcc-c 编译器。nginx依赖的 pcre 和 zlib 包 yum -y install gcc zlib zlib-devel pcre-devel openssl openss…

嵌入式通信协议【Modbus】Modbus功能码的详细描述

一、读功能码 1、 01 (0x01)读线圈 在一个远程设备中&#xff0c;使用该功能码读取线圈的 1 至 2000 连续状态。请求 PDU 详细说明了起始地址&#xff0c;即指定的第一个线圈地址和线圈编号。从零开始寻址线圈。因此寻址线圈 1-16 为 0-15。 根据数据域的每个比特将响应报文…

vs 推送代码 之 gitee

我们常常想将自己的代码放入到代码管理工具中&#xff0c;接下来我们将讲解如何去将vs中的代码放入到代码管理工具中 目的&#xff1a;将vs中的项目代码放入到gitee中 首先&#xff1a; 我们需要注册一下gitee的账号&#xff0c;官网&#xff1a;gitee官网 辅助工具&#xff…

做网络那么多年,连以太网接口和串口都分不清?本文值得一看!

路由器是一种网络设备&#xff0c;它的主要功能是在不同的网络之间转发数据包&#xff0c;实现网络互联。路由器根据数据包的目的地址&#xff0c;选择最佳的路径&#xff0c;将数据包发送到下一跳。路由器可以连接不同的网络类型&#xff0c;如以太网、帧中继、PPP等。 路由器…

JavaWeb_Mysql_多表设计与查询

JavaWeb_Mysql_多表设计与查询 多表设计外键约束物理外键 -- 不推荐逻辑外键 多表关系实现 多表查询数据准备内连接外连接子查询标量子查询列子查询行子查询表子查询 案例数据准备案例需求 来源 多表设计 外键约束 物理外键 – 不推荐 概念: 使用foreign key定义外键关联另外…

关于网络命令 ping 你了解多少

1、介绍 Ping(Packet Internet Groper)是 Windows、Unix 和 Linux系统下的一个命令。ping 也属于一个通信协议&#xff0c;是 TCP/IP 协议的一部分。   Ping的运作原理是向目标主机传出一个 ICMP&#xff08;Internet Control Messages Protocol&#xff09;即因特网信报控制…

Linux内核的源码目录结构和配置体系

1.linux内核源码目录结构1 1.1、源码从哪里来 (1)我们使用2.6.35.7版本的内核。这个版本的内核有三种&#xff1a;第一种是kernel.org上的官方版本&#xff0c;第二种是三星移植过的&#xff0c;第三种是九鼎X210的移植版本。这里使用第三个。 (2)进入源码目录下&#xff0c…

《QT+PCL》点云配准进阶——GROR配准

《QT+PCL》点云配准进阶——GROR配准 一、展示效果二、ui设计三、代码3.1添加代码一、展示效果 根据之前的文章GROR复现,今天将其集成到QT软件中 二、ui设计 三、代码 3.1添加代码 qt的头文件、源文件依旧添加相关代码 其中,如果有函数冲突,改成内联函数,添加inline<…