challenge 重複する要素を取り除く

与えられたリストxsの中から、 2回以上出現するものを全部取り除いてください。

サンプル入力
[3, 1, 4, 1, 5, 9, 2, 6, 5]
サンプル出力
[3, 4, 9, 2, 6]

これはアレイのuniqの派生問題です。 リストとかアレイという言葉は言語によってまちまちの意味で使われているので、 「配列のようなもの」という漠然とした意味にとって構いません。

Posted feedbacks - PHP

PHPは配列操作得意ですね。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
function only_unique($ary) {
	foreach ( $ary as $val ) {
		if ( count(array_keys($ary,$val)) == 1 ) {
			$rtn[] = $val;
		}
	}
	return $rtn;
}

print_r(only_unique(array(3, 1, 4, 1, 5, 9, 2, 6, 5)));
?>

array_count_valuesを使って。
やってみたところ配列の順序は保存される様ですが、
関数の仕様として保証されているものではなさそうなので
順序(というかキー)を保存するバージョンもセットで投稿します。
(…お題の要件として順序の保存は必要なかったのかな?)
配列の値で何度も検索するような場合は(状況が許せば)array_flipで
キーと値を入れ換えちゃうと速い(気がする)。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
function oneces($a) {
	$cs=array_count_values($a);
	$r=array();
	while(list($v,$c)=each($cs))
	{	if($c==1)
			$r[]=$v;
	}
	return $r;
}

//キーを保存するバージョン
function oneces2($a) {
	$cs=array_count_values($a);
	$a=array_flip($a);
	while(list($v,$c)=each($cs))
	{	if($c>1)
			unset($a[$v]);
	}
	return array_flip($a);
}

print_r(oneces(array(3, 1, 4, 1, 5, 9, 2, 6, 5)));
print_r(oneces2(array(3, 1, 4, 1, 5, 9, 2, 6, 5)));
?>

シンプルに
1
2
3
4
5
6
7
<?php
function only_unique($a){
	return array_keys(array_count_values($a), 1);
}

print_r(only_unique(array(3, 1, 4, 1, 5, 9, 2, 6, 5)));
?>

Index

Feed

Other

Link

Pathtraq

loading...