1.

要求输入一组英文字符串数组,让这个字符串数组中前面一个元素的最后一个 字母和下一个元素的首位上的字母相等,并且每个元素的长度大于等于2且小于等于100

public static void

main(String[] a )

{

Two t = new

Two();

System.out.println(t.s());

}

public int

s(){

//

String[] args={"abcd","def","fgr","rtg"};

String[]

args={"abcd","def","A","rtg"};

for (int i=0;i

boolean

b1 =args[i].matches("[a-z]+");

boolean

b2 = args[i].length()>=2 ;

boolean

b3 = args[i].length()<=100 ;

if(b1&&b2&&b3){

char c1 =

args[i].charAt(args[i].length()-1);

char c2 =

args[i+1].charAt(0);

if(c1==c2){

b=

Two.show1();

}else{

b=

Two.show2();

break;

}

}else{

b=

Two.show2();

break;

}

}

if(b==true){

return

1;

}else{

return

-1;

}

}

public static boolean show1(){

return true;

}

public static boolean show2(){

return false;

}

2、快速找出一个数组中的最大数、第二大数。

思路:如果当前元素大于最大数 max,则让第二大数等于原来的最大数

max,再把当前元素的值赋给

max。如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值,则要把当前元素的值赋给

secondMax。

public

static void main(String[] a1 )

{

Two t = new

Two();

int[]

a={12,233,4232,2,23,1,234};

t.compare(a);

}

public void

compare(int[] a){

int max =

a[0];

int max2 =

a[a.length-1];

for(int

i=0;i

if(a[i]>max){

max2 =

max;

max =

a[i];

}else

if(a[i]>max2 && a[i]

max2 =

a[i];

}

}

System.out.println("这个数组最大的是:"+max);

System.out.println("这个数组第二大的是:"+max2);

}

法二:

public

static void main(String[] a1 )

{

Two t = new

Two();

int[]

a={12,233,4232,2,23,1,234};

java.util.Arrays.sort(a);

System.out.println(java.util.Arrays.toString(a)

);//输出数组可以不用遍历

System.out.println("这个数组最大的是:"+a[a.length-1]);

System.out.println("这个数组第二大的是:"+a[a.length-2]);

}

3、试着用最小的比较次数去寻找数组中的最大值和最小值。

解法一:扫描一次数组找出最大值;再扫描一次数组找出最小值。比较次数2N-2

解法二:将数组中相邻的两个数分在一组,每次比较两个相邻的数,将较大值交换至这两个数的左边,较小值放于右边。对大者组扫描一次找出最大值,对小者组扫描一次找出最小值。

比较1.5N-2次,但需要改变数组结构

解法三:

每次比较相邻两个数,较大者与MAX比较,较小者与MIN比较,找出最大值和最小值。

方法如下:先将一对元素互相进行比较,然后把最小值跟当前最小值进行比较,把最大值跟当前最大值进行比较。因此每两个元素需要3次比较。如果n为奇数,那么比较的次数是3*(n/2)次比较。如果n为偶数,那么比较的次数是3n/2-2次比较。因此,不管是n是奇数还是偶数,比较的次数至多是1.5n :

public

static void main(String[] a1 )

{

Two t = new

Two();

int[]

a={12,233,4232,-12,23,1,234};

t.compare(a);

}

public

void compare(int[] a){

int max =

a[0];

int min =

a[a.length-1];

for(int

i=0;i

if(a[i]>a[i+1]){

if(a[i]>max){

max =

a[i];

}

if(a[i+1]

min =

a[i+1];

}

}

}

System.out.println("这个数组的最大值是:"+max);

System.out.println("这个数组的最小值是:"+min);

}

4、重排问题

给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,要求:

1、排序后所有0元素在前,所有非零元素在后,且非零元素排序前后相对位置不变

2、不能使用额外存储空间

例子如下

输入 0、3、0、2、1、0、0

输出 0、0、0、0、3、2、1

分析: 如果当前位置上为0,他前面的不为0 ,则交换

public

static void main(String[] a1 )

{

int[] a ={0,1,2,0,3,0,2,0,0};

for(int j=0;j

for(int i=1;i

if( a[i]== 0&& a[i-1]!=0){

a[i]=a[i-1];

a[i-1]=0;

}

}

}

System.out.println(java.util.Arrays.toString(a));

}

5、找出绝对值最小的元素

给定一个有序整数序列(非递减序),可能包含负数,找出其中绝对值最小的元素,比如给定序列 -5、-3、-1、2、8 则返回1。

分析:由于给定序列是有序的,而这又是搜索问题,所以首先想到二分搜索法,只不过这个二分法比普通的二分法稍微麻烦点,可以分为下面几种情况

如果给定的序列中所有的数都是正数,那么数组的第一个元素即是结果。

如果给定的序列中所有的数都是负数,那么数组的最后一个元素即是结果。

如果给定的序列中既有正数又有负数,那么绝对值的最小值一定出现在正数和负数的分界处。

为什么?因为对于负数序列来说,右侧的数字比左侧的数字绝对值小,如上面的-5、-3、-1,而对于整整数来说,左边的数字绝对值小,比如上面的2、8,将这个思想用于二分搜索,可先判断中间元素和两侧元素的符号,然后根据符号决定搜索区间,逐步缩小搜索区间,直到只剩下两个元素。

单独设置一个函数用来判断两个整数的符号是否相同

public

static void main(String[] a1 )

{

int[] a ={-5,-3,12,-1,90,2,9};

int[] b = new int[a.length];

for(int

i=0;i

b[i] = Math.abs(a[i]);

}

int minAbs

= b[0];

for(int

i=0;i

if(b[i]

minAbs =

b[i];

}

}

System.out.println(java.util.Arrays.toString(a));

System.out.println(java.util.Arrays.toString(b));

System.out.println(minAbs);

}

6、从长度为n的数组(元素互不相同)中任意选择m个数的所有组合。

7、从长度为n的数组(元素有可能相同)中任意选择m个数的所有组合。

先对数组进行排序,然后设置一个标记pre,记录前一个选择的数字,然后进行比较。

import

java.util.*;

public

class Two

{

public

static void main(String[] a1 )

{

String[] data = {"1", "2", "2","3", "4", "5"};

int num = 3;

List> result = parade(Arrays.asList(data), num);

for (List x : result) {

System.out.println(x);

}

System.out.printf("total:%s\n", result.size());

}

public static List> parade(List data, int num) {

List> result = new ArrayList>();

if (num == 1) { //只排一个元素的时候(递归结束条件)

for (String s : data) {

List l = new ArrayList();

l.add(s);

result.add(l); //每个元素分别保存到结果集

}

return result; //并返回结果集

}

for (int i=0; i1,即排多个元素的时候,循环

List list = new ArrayList(data);

list.remove(i);

//去掉当前循环的元素作为下次递归的参数,即剩余的元素做递归

List> sub = parade(list, num-1); //递归调用

for (List l : sub) { //然后循环递归得到的结果

l.add(0, data.get(i)); //把当前元素排在每个结果的前面

result.add(l);

//并保存到结果集

}

}

return result; //最后返回结果集

}

}

8、三色旗排序问题

假设有一根绳子,上面有一些红、白、蓝色的旗子。起初旗子的顺序是任意的,现在要求用最少的次数移动这些旗子,使得它们按照蓝、白、红的顺序排列。注意只能在绳子上操作,并且一次只能调换两个旗子。

public

class Two {

public static final char BLUE = 'b';

public static final char RED = 'r';

public static final char WHITE = 'w';

public static final char[] color = { 'r', 'w', 'b', 'w', 'w', 'b',

'r', 'b', 'w', 'r' };

// 交换彩旗的方法

public static void SWAP(int x, int y) {

char temp = color[x];

color[x] = color[y];

color[y] = temp;

}

public static void main(String[] a1) {

int bFlag = 0;

int wFlag = 0;

int rFlag = color.length - 1;

for (int i = 0; i < color.length; i++) {

System.out.print(color[i]);

}

System.out.println();

while (wFlag <= rFlag) {

if (color[wFlag] == WHITE) {

wFlag++;

} else if (color[wFlag] == BLUE) {

SWAP(bFlag, wFlag);

bFlag++;

wFlag++;

} else {

while (wFlag < rFlag && color[rFlag] == RED)

{

rFlag--;

}

SWAP(rFlag, wFlag);

rFlag--;

}

}

for (int i = 0; i < color.length; i++) {

System.out.print(color[i]);

}

System.out.println();

}}

9、一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。

分析:最原始的方法是检查每一个数 array[i] ,看是否左边的数都小于等于它,右边的数都大于等于它。这样做的话,要找出所有这样的数,时间复杂度为O(N^2)。

其实可以有更简单的方法,我们使用额外数组,比如rightMin[],来帮我们记录原始数组array[i]右边(包括自己)的最小值。假如原始数组为:

array[] = {7, 10, 2, 6, 19, 22,

32},

那么rightMin[] = {2, 2, 2,

6, 19, 22, 32}. 也就是说,7右边的最小值为2, 2右边的最小值也是2。

有了这样一个额外数组,当我们从头开始遍历原始数组时,我们保存一个当前最大值 max,

如果当前最大值刚好等于rightMin[i],

那么这个最大值一定满足条件,还是刚才的例子。

第一个值是7,最大值也是7,因为7 不等于 2,

继续,

第二个值是10,最大值变成了10,但是10也不等于2,继续,

第三个值是2,最大值是10,但是10也不等于2,继续,

第四个值是6,最大值是10,但是10不等于6,继续,

第五个值是19,最大值变成了19,而且19也等于当前rightMin[4] = 19, 所以,满足条件。如此继续下去,后面的几个都满足。

public

class Two {

public static void main(String s[]) {

try {

smallLarge(new int[] { 7, 10, 2, 6, 19, 22, 32 });

} catch (Exception e) {

e.printStackTrace();

}

}

public static void smallLarge(int[] array) throws Exception

{

if (array == null || array.length < 1) {

throw new Exception("the array is null or the array has no

element!");

}

int[] rightMin = new int[array.length];

rightMin[array.length - 1] = array[array.length - 1];

for (int i = array.length - 2; i >= 0; i--) {

if (array[i] < rightMin[i + 1]) {

rightMin[i] = array[i];

} else {

rightMin[i] = rightMin[i + 1];

}

}

int leftMax = Integer.MIN_VALUE;

for (int i = 0; i < array.length; i++) {

if (leftMax <= array[i]) {

leftMax = array[i];

if (leftMax == rightMin[i]) {

System.out.println(leftMax);

}

}

}

}

}

10、整数的拆分问题

如,对于正整数n=6,可以拆分为:

6

5+1

4+2

4+1+1

3+3

3+2+1

3+1+1+1

2+2+2

2+2+1+1

2+1+1+1+1

1+1+1+1+1+1

现在的问题是,对于给定的正整数n,程序输出该整数的拆分种类数

public

class Two {

public static int splitInteger(int sum,

int max, int[] data, int index) {

if (max > sum) max = sum;

if (sum < 1 || max < 1) return 0;

if (sum == 1 || max == 1) {

if (sum == 1) {

data[index] = sum;

print(data, index+1);

} else {

for (int i = 0; i < sum; i++) {

data[index++]

= max;

}

print(data, index);

}

return 1;

}

if (sum == max) {

data[index] = max;

print(data, index+1);

return 1 + splitInteger(sum, max-1, data, index);

} else if (sum > max) {

data[index] = max;

//一定注意这里的先后顺序

return splitInteger(sum-max, max, data, index+1) +

splitInteger(sum, max-1, data, index);

} else {

//sum < max

return splitInteger(sum, sum, data, index);

}

}

public

static void print(int[] data, int index) { //打印数组

for (int i = 0; i < index -1; i++) {

System.out.print(data[i] + "+");

}

System.out.println(data[index-1]);

}

*

正整数加法不同分解的个数:最大值为max,和为sum的加法个数

递归形式: f(sum, max) =

f(sum-max, max) + f(sum, max-1);

public static int count(int sum, int max) {

if (sum < 1 || max < 1) return 0;

else if (sum == 1 || max == 1){

return 1;

} else if (sum < max) {

return count(sum,sum);

} else if (sum == max) {

return 1+count(sum, sum-1);

} else {

return count(sum, max-1)+count(sum-max,max);

}

}

public static void main(String[] args) {

int n = 4;

int[] data = new int[n];

System.out.println("正整数\'" + n + "\'可以分解为如下不同的加法形式:");

System.out.println("正整数\'" + n + " \'加法分解个数为:\t" + splitInteger(n,n,data,0));

n = 100;

System.out.println("正整数\'" + n + "\'加法分解个数为(包含本身):\t" + count(n,n));

System.out.println("正整数\'" + n + "\'加法分解个数为(不包含本身):\t" + count(n,n-1));

}

}

11、在数组中寻找和为给定值的组合

public class Two

{

static int[] arr ={1, 5, 9, 3, 4, 7, 6, 2, 8};

static int maxIndex = arr.length - 1;// 索引最大值

static int sum = 11;// 求两个数的和等于的值

public static void main(String[] args)

{

find1(arr);

}

//

1.所有数字两两组合,计算;时间复杂度O(n*n)

//

2.先把数组排序,然后利用二分查找在数组中查找,判断sum-arr[i]是否在数组中;时间复杂度O(n*longn)

//

3.先对数组排序i=0,j=n-1,如果:sum如果:sum

//

如果有序,直接两个指针两端扫描,时间O(N);如果无序,先排序后两端扫描,时间O(N*logN+N)=O(N*logN),空间始终都为O(1)

static void find1(int[]

arr) {

Arrays.sort(arr);// 对数组排序

for (int i = 0, j = maxIndex; i < j;)

{

if (arr[i] + arr[j] == sum)

{

System.out.println(sum + " = " + arr[i] + " + " +

arr[j]);

i++;//

没有这一句死循环

}

else if (arr[i] + arr[j] < sum)

{

i++;

}

else

{

j--;

}

}

}}

12、求数组中两个元素差的最大值

import

java.util.*;

public

class Two {

public static void main(String[] a1) {

Listresult = new ArrayList();

int[] aa =

{12,2,34,54,65,3,2,5,-12,4,0};

for(int i

=0;i

for(int j

=0; j

int cha =

aa[i]-aa[j];

int cha2 =

aa[j]-aa[i];

result.add(cha);

result.add(cha2);

}

}

int min =

result.get(0);

for(int i

=0;i

if(result.get(i)<

min){

min =

result.get(i);

}

}

System.out.println("两个元素的差为:");

for(Integer

x : result){

System.out.print(x+"

");

}

System.out.println();

System.out.println("两个元素的差总共有"+result.size()+"个");

System.out.println("两个元素的差的最小值时:"+min);

}

}

13、输入一个正数

n,输出所有和为

n 连续正数序列。

例如输入 15,由于

1+2+3+4+5=4+5+6=7+8=15,所以输出

3 个连续序列 1-5、4-6 和 7-8。

package

com.tankxiancheng;

public

class Two {

public

static void

getAns(int n){

int beg=1;

int sum=1;

int cur=1;

while(beg<=n/2+1){

if(sum==n){

for(int k=beg;k<=cur;k++){

if(k == cur){

System.out.print(k+"=15");

}else{

System.out.print(k+"+");

}

}

System.out.println();

sum=sum-beg;

beg++;

cur++;

sum+=cur;

}

if(sum>n){

sum=sum-beg;

beg++;

}else

{

cur++;

sum+=cur;

}

}

}

public

static void main(String[] args) {

getAns(15);

}

}

java 数组 题_(第22讲)java数组的一些编程题相关推荐

  1. python字典程序题_急!一道关于python字典的编程题!求思路!

    作业要求做一个python程序导入一个文本文件(importsys,file_in=open(sys.argv[1],'r'))那个文本文件里都是AnimalId:Timestamp:StationI ...

  2. vba数组如何精确筛选_第22讲:利用动态数组去除重复值的方法

    大家好,我们今日继续讲解VBA数组与字典解决方案第22讲:在VBA中如何使用动态数组,以及利用动态数组去除重复值的方法.如果文本中含有大量的重复值,此时,如果我们要剔除重复值,该怎么办?用VBA的方法 ...

  3. 数据库decimal对应java什么类型_数据库类型和java类型对应关系 | 学步园

    类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) 描述 VARCHAR  L+N  VARCHAR  java.lang.String 12 CHAR N CHAR java. ...

  4. 计算机二级c编程题特殊技巧,计算机国家二级C机试编程题技巧

    一个公开的秘密:计算机国家二级C机试编程题的作弊方法 1.运行考试系统 2.打开编程题(第三大题),软件会自动启动vc++6.0,然后在需要考生编写的函数代码里加一个分好":"其他 ...

  5. java 初始化参数_我们如何在Java中的对象参数中初始化数组?

    您可以使用构造函数或使用setter方法来初始化与其他任何值一样在类内部声明的数组变量. 示例 在下面的Java示例中,我们声明一个数组类型的实例变量,并从构造函数中对其进行初始化.public cl ...

  6. java applet编程_第二十讲 Java Applet程序设计

    第二十讲Java Applet程序设计 主要内容 初识Java Applet Java Applet的生命周期 Graphics类和图像图形绘制 Applet中播放声音媒体 初识Java Applet ...

  7. JAVA不同类型数组重载_方法的重载;数组 (Java Day05)

    一,方法的重载 概念:在一个类中,拥有多个方法名相同,参数列表不同的方法的现象叫做方法的重载 特征: ​            1.在同一个类中 ​            2.方法名相同 ​     ...

  8. 做Java头发少_这35个Java代码优化细节,你用了吗

    链接:https://www.jianshu.com/p/6e472304b5ac 前言 代码 优化 ,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有 ...

  9. java 判断类型_如何快速入门Java编程学习(干货)

    一.初识Java 1.生活中的程序: 从起床到教室上课的过程 穿衣打扮>起床>洗漱>出宿舍>>吃早餐>到教室 按照特定的顺序去完成某一件事的过程我们叫做生活中的程序 ...

  10. 计算机java语言答案_【计算机二级Java语言】卷019

    选择题 公共知识 [1]下列叙述中正确的是 [A]算法的时间复杂度与计算机的运行速度有关 [B]算法的时间复杂度与运行算法时特定的输入有关 [C]算法的时间复杂度与算法程序中的语句条数成正比 [D]算 ...

最新文章

  1. html5主要是针对哪方面行优化,前端知识点总结(HTML篇)
  2. 2019手机浏览器排名_浏览器排行榜2019年1月浏览器市场份额排名
  3. [poj3041]Asteroids(二分图的最小顶点覆盖)
  4. 程序基本功之遍历二叉树
  5. Mybatis---全局配置解析 --根据官方文档--常用
  6. FFmpeg源代码:avcodec_open2()
  7. 使用Microsoft Word2016无法正常对Latex文本转换的踩坑和解决方法
  8. qq空间说说服务器维护,如何解决QQ空间说说发表不了
  9. 自定义C++异常处理
  10. 分治应用--万里挑一 找假硬币
  11. Jupyter-notebook安装问题及解决
  12. 高阶无模型自适应迭代学习控制学习记录
  13. PDF预览之PDFObject.js总结
  14. vue中利用高德地图选取经纬度
  15. WPF控件模板和数据模板的区别
  16. 草莓换个做法,迫不及待想要吃
  17. ACL2021_Enhancing Entity Boundary Detection for Better Chinese Named Entity Recognition
  18. [系统安全] 五.OllyDbg和Cheat Engine工具逆向分析植物大战僵尸游戏
  19. Nickel 28就青山控股集团镍锍生产计划发表评论
  20. 计算机知识动画小学,电脑动画

热门文章

  1. 详解XMind各种上传分享分类
  2. 各位最近找我索要CCNA200-120的资源的同志些
  3. 各种开发源代码软件许可证异同
  4. 凡科虚拟服务器怎样做301,虚拟主机301重定向怎么做?网站301重定向方法之一
  5. jsp页面取整数 和Java页面取整数
  6. bcb 接收webservice tbytedynarray_文章推荐:基于分集接收技术的可见光接收机前端电路...
  7. android:theme.holo.light.,Android: Theme.Holo.Light.NoActionBar vs Theme.Light.NoTitleBar
  8. 旋转的Apriltag码
  9. paddle中的自动求解梯度 : autograd.backward
  10. AD633低成本模拟乘法器