`
zhaojian0910
  • 浏览: 47557 次
社区版块
存档分类
最新评论

倒水问题引出的 不特定的N次for循环嵌套

    博客分类:
  • java
 
阅读更多

偶然在CSDN看到一个帖子,说有个某互联网巨头公司的笔试题目--倒水问题

题目:现有M升水,N个杯子,把水倒入杯子中,假设单个杯子足够盛满M升水,且杯子可以为空,杯子之间没有区别,求有多少种倒发。

输入:7升水,3个杯子,得到结果8个

 

体现出算法基础的薄弱了,敏思苦想了1整天。

 

0 0 (M减去前两项)

0 1 (M减去前两项)

0 2 (M减去前两项)

0 3 (M减去前两项)

1 0 (M减去前两项)

1 1 (M减去前两项)

........

 

大概就是这么个情况

 

这里引入一个问题就是每有一个杯子就要一次for循环,因为是N个杯子,还不知道N是几,这就是题目所说的不确定的N次for循环嵌套的问题

 

下面给代码吧

package com;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.Test;

public class DaoShui
{
	/**
	 * M 升水,N个杯子
	 */
	int M = 7;
	int N = 3;
	
	List<Object[]> list = new ArrayList<Object[]>();
	
	private int[] arr = new int[N];
	
	int result = 0;
	
	/**
	 * 不特定的多次for循环嵌套
	 * @param j
	 */
	void XunHuan(int j)
	{
		if (j == arr.length)
		
		{
			List<Integer> values = new ArrayList<Integer>();
			for (int i : arr)
			{
				result = result + i;
				values.add(i);
			}
			if (result == M)
			{
				list.add(values.toArray());
			}
			result = 0;
			return;
			
		}
		
		while (arr[j] <= M)
		
		{
			XunHuan(j + 1);
			arr[j]++;
			if (j + 1 < arr.length)
			{
				arr[j + 1] = 0;
			}
		}
	}
	
	/**
	 * 测试类
	 */
	@Test
	public void show()
	{
		XunHuan(0);
		
		List<Object[]> list2 = new ArrayList<Object[]>();
		
		boolean flag = true;
		
		/*
		 *  list是取出了所有情况,但是这并不是我们想要的
		 *  我们要去重,即007和070和700都是相同的
		 *  首先我们数组排序,然后比较数组的值是否一致
		 */
		for (Object[] a : list)
		{
			Arrays.sort(a);
			for (Object[] obj : list2)
			{
				if (Arrays.equals(obj, a))
				{
					flag = false;
					break;
				}
			}
			if (flag)
			{
				list2.add(a);
			}
			flag = true;
		}
		
		for (Object[] o : list2)
		{
			for (Object ob : o)
			{
				System.out.print(ob);
			}
			System.out.println();
		}
	}
}

 

这个可能不是最好的算法,但是暂时解决了心中疑问了

 

输出结果:

007

016

025

034

115

124

133

 

223

 

一共8种

分享到:
评论

相关推荐

    倒水问题的解答

    从给定文件中我们可以看到,这是一段关于“倒水问题”的C++代码,它涉及到一些编程技巧和算法思路。接下来,我们将从几个方面来详细介绍这个文件中包含的知识点。 ### 标题和描述知识点 #### 倒水问题 - 倒水问题...

    三个容器的倒水问题(C语言实现)

    标题 "三个容器的倒水问题(C语言实现)" 涉及到的是一个经典的算法问题,通常出现在计算机科学的面试或编程挑战中。这个问题的核心是通过使用三个容器来确定如何最大限度地转移水,使得两个容器中的水量之和达到某个...

    分水问题和倒水问题

    分水问题和倒水问题是一种经典的数学和编程挑战,它涉及到如何通过有限的容器和操作,将一定量的水精确地分成目标体积。在这个特定的问题中,我们需要利用一个8升和一个5升的容器,将12升水分为两个6升。这需要巧妙...

    倒水解密附带源码

    杯子类还应包含倒水到其他杯子的方法,该方法需要判断是否满足倒水条件(例如,不能从空杯倒水,也不能将水倒入已满的杯子)。在这个过程中,我们可能需要使用递归或者栈来实现状态转移,每一步操作都是从当前状态...

    java项目_五五开倒水

    【描述】描述中的"java项目_五五开倒水"重复三次,这可能表示项目的核心是围绕着这个主题展开的,开发者通过Java语言来模拟游戏过程,可能包括用户交互界面、倒水逻辑处理、错误检查等模块。项目的重点在于如何设计...

    专家系统水壶倒水问题C#程序

    在这个名为“专家系统水壶倒水问题C#程序”的项目中,我们主要关注的是一个经典的逻辑谜题,通常称为“水壶问题”或“倒水问题”。这个问题涉及到两个不同容量的水壶,一个能装4公斤水,另一个能装3公斤水。目标是...

    “倒水”算法代码实现

    在这个问题中,我们通常有两个或三个有刻度的容器,目标是通过一系列倒水操作,使得某个容器中的水量达到特定的目标值。这个问题在编程竞赛和面试中常见,用于测试候选人的逻辑思维和问题解决能力。 VC++是...

    倒水解密游戏源码2012918

    倒水解密游戏源码 游戏介绍: 《倒水解密》是一款很不错的益智类游戏 有N个容量不同的瓶子,指定「将a升水倒入容量为b的瓶子」。 游戏要求通过装水、倒水,达成给定的目标。 游戏操作方式如下: ?在瓶子上双击...

    Jugs问题求解C++

    这个问题涉及到两个容量分别为m升和k升的水壶,目标是通过倒水操作使得其中一个水壶装满n升水。题目提供的C++代码正是为了解决这个问题。 在C++代码中,首先定义了两个字符数组a和b,分别代表两个水壶,用'A'表示m...

    人工智能 水壶问题的求解.rar

    这个问题通常涉及到两个有固定容量的水壶,以及一个精确度目标,要求通过倒水操作找到一种方法,使得某一个水壶的水位达到特定的目标值。这个问题在计算机科学中具有重要的地位,因为它能够展示如何运用有限的资源和...

    js实现杯子倒水问题自动求解程序

    JavaScript 实现的“杯子倒水问题自动求解程序”是一种逻辑算法,用于解决常见的智力测试题目,即如何通过几个容量不等的杯子之间的倒水操作,达到特定的水量分配。这种问题通常涉及到策略和数学推理,对编程爱好者...

    OC ioc Xcode三个水杯倒水

    标题“OC ioc Xcode三个水杯倒水”所指的是一个iOS开发的示例项目,主要使用Objective-C(OC)语言,并结合了Inversion of Control(IoC)的设计模式,通过Xcode集成开发环境实现。这个项目的核心是模拟三个水杯之间...

    3d倒水小动画的制作

    自己做的3D倒水是初学者的首选 和容易懂的

    智能倒水机器人的设计.pdf

    智能倒水机器人的设计主要涉及了机器人学、自动化控制、传感器技术以及嵌入式系统开发等多个IT领域的知识点。具体而言,该设计涵盖了以下关键内容: 1. 机器人结构设计:在机器人设计中,机械结构的设计是基础,本...

    comfjshmnp-sec.tar

    两个杯子倒水问题,两个版本解决方案,BFS遍历方式,csdn

    倒水声.zip音效声音WAV格式或MP3格式素材下载

    本资源包“倒水声.zip”提供了WAV和MP3两种格式的倒水声音效,适用于不同需求的用户群体。 首先,我们要了解WAV和MP3这两种常见的音频格式。WAV是微软和IBM共同开发的一种无损音频格式,它保留了原始录音的所有细节...

    野比的倒水解密游戏,纯GDI+,自己DIY游戏

    野比的倒水解密游戏,纯GDI+,自己DIY游戏。

    HTML5小游戏【猛倒水,练手速游戏】游戏源码分享下载 - fkbttz.zip

    练手速游戏】游戏源码分享下载 --- fkbttz.zipHTML5小游戏【猛倒水,练手速游戏】游戏源码分享下载 --- fkbttz.zipHTML5小游戏【猛倒水,练手速游戏】游戏源码分享下载 --- fkbttz.zipHTML5小游戏【猛倒水,练手速...

    几个CSDN高校挑战赛的小例子

    在编程实现时,可以使用for或while循环,结合if-else语句进行控制。 3. **二十进制的加法** 这个主题是基础的数值计算,但将问题扩展到了非十进制系统。在二进制、八进制、十六进制等其他进制中进行加法运算,需要...

Global site tag (gtag.js) - Google Analytics