【问题标题】:Array list and finding the longest subsequence with the same number [closed]数组列表并找到具有相同数字的最长子序列[关闭]
【发布时间】:2014-02-27 19:04:16
【问题描述】:

我想知道实现这一点的最佳方法是什么。

想不出什么好办法来保存需要保存的信息之类的 索引和值的数量,最后是重复的实际数量

public class testing 
{

public static void main(String[] args) 
{
    ArrayList<Integer> numbers = new ArrayList<Integer>();
    Scanner in = new Scanner(System.in);
    Integer a =0;
    Integer value = 0;
    Integer num = 0;

    boolean loop = true;
    //getting the string information
    while(loop)

    {
        System.out.println("Enter a series of numbers, 0 to stop");
        Integer n = in.nextInt();
        if(n.equals(0))
        {
            break;
        }
        else
        { 
            numbers.add(n);         

        }



    }

    for (int i = 1; i < numbers.size(); i++)
    { 




    }

}



}

【问题讨论】:

  • 您最好确保展示您的作品。根据 Stack Overflow 政策,我们现在无法回答这个问题。

标签: java string subsequence


【解决方案1】:

您可以使用 2d ArrayList,声明如下:

ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();

然后在流程结束时声明要添加到其中的 2 个 ArrayList:

ArrayList<Integer> length = new ArrayList<Integer>();

ArrayList<Integer> value = new ArrayList<Integer>();

然后

1) 遍历列表,检查元素是否与前一个相同。

如果是,则继续直到结束或发现一个不同的元素,此时将先前相等元素的数量存储在称为'length'的ArrayList中,并将元素的值存储在称为'value'的元素中.有一个 int (称为 index ),它存储元素的索引长度包含最长的当前子序列的长度(这将与包含它组成的元素的值的元素的索引相同(它有存储在值中))。

如果不是,请移至下一个元素。

2) 重复该过程,必要时更新索引(即,如果发现更长的子序列)。

要在最后为结果添加长度和值,只需执行 result.add(length);result.add(value);

如果您想返回一个包含所有必需信息的对象,您可以将 int 'index' 包装在一个 Integer 中并将其添加到名为 'length' 的 ArrayList 的末尾,甚至将其放入一个新的 ArrayList 中并将该 ArrayList 添加到结果中。

请注意,要在第一个 ArrayList 中的索引 i 处检索元素(在本例中称为“长度”),然后将其存储在结果中,您需要这样做

result.get(0).get(i);

编辑:

所以我想到的 for 循环部分是这样的:

boolean same = false;
int sequenceLength = 0;
Integer sequenceInteger = null; 

for (int i = 1; i < numbers.size(); i++)
        { 
            if(numbers.get(i).equals(numbers.get(i-1)))
                {
                      same = true;
                      sequenceLength++;
                }      
            else(if same == true)
                {
                      sequenceInteger = new Integer(sequenceLength);
                      //add sequenceInteger to length and numbers.get(i-1) to value 
                      same = false;
                      sequenceLength = 0;
                }
            // else do nothing since same is false, which means that the current
            // element is different from the previous and the previous is 
            // different the one before that, so there are no new values to store
        }
// end of list reached
(if same == true)
{
      sequenceInteger = new Integer(sequenceLength);
      //add sequenceInteger to length and numbers.get(i-1) to value 
      same = false;
}

【讨论】:

  • 我会保留数字的初始数组吗?而 2d 数组用于存储其他 2 个数组的长度和值?为了开始比较,我必须做类似 Integer a = numbers.get[i];然后如果 a = numbers.get[i+1] 然后将其添加到列表中?
  • 对问题 1 和 2 是肯定的(除了它们是 ArrayList,而不是数组)。拒绝第 3 部分,因为 i) 用整数测试相等性我认为你需要这样做 if(numbers.get(i).compareTo(numbers.get(i-1))==0), and ii) you're如果它等于下一个数字,则不要添加一个数字(就像您在第三个问题中所做的那样)。如果它等于前一个,你甚至不会添加它。如果您在此不同的相等后续元素列表之后立即到达第一个元素或到达列表末尾时找到至少 2 个相等后续元素的列表,则您正在添加它。
  • (即,如果当前元素与前一个元素不同但前一个元素与前一个元素相同,则将前一个元素的值添加到 ArrayList 'value')。为此,您可以在 while 循环中设置一个 while 循环。到达列表末尾时,外部 while 循环终止。在外部 while 循环中,如果(元素 i 与元素 i-1 不同)移动到下一个元素,else { while(boolean same == true) if (元素 i 等于元素 i-1) 增加一个 int 存储序列长度 } else {same = false}.
  • (即,如果当前元素与前一个元素不同但前一个元素与前一个元素相同,则将前一个元素的值添加到 ArrayList 'value')。为此,请参阅我的答案的编辑。这比我刚刚删除的 cmets 中建议的方法更好。
  • (即,如果当前元素与前一个元素不同但前一个元素与前一个元素相同,则将前一个元素的值添加到 ArrayList 'value')。为此,请参阅我的答案的编辑。这比我在刚刚删除的 cmets 中建议的方法更好。编辑 2:对于平等测试,我将其更改为 if(numbers.get(i).equals(numbers.get(i-1)))。 compareTo 用于测试它是否等于、小于或大于而不是等于或不等于,如本例所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-01
  • 2016-07-17
  • 2020-04-18
相关资源
最近更新 更多