如何使用PHP解决这个问题?
假设给出了一个正整数类型的数字,例如:312。请帮助我用PHP编写一个程序,将给定的数字转换为具有相同位数的新数字,并且新数字的所有位数必须等于给定数字的任何位数(例如:333、111、222,每次只能将每个数字递减或递增1)。但仅打印生成序列所需步骤较少的数字序列,并打印生成该序列所需步骤的数量 说明: 输入:正整数N(例如:312) 将数字(312)转换为3的序列 3 2 2 3 3 2 三三三 这里的步骤数=3 现在,将数字(312)转换为1的序列 2 1 2 1 1 2 11 这里的步骤数=3 最后将数字(312)转换为2的序列 2 1 2 2 2 这里的步骤数=2 因此,产出:222 步骤数:2 这是我试过但失败的东西如何使用PHP解决这个问题?,php,Php,假设给出了一个正整数类型的数字,例如:312。请帮助我用PHP编写一个程序,将给定的数字转换为具有相同位数的新数字,并且新数字的所有位数必须等于给定数字的任何位数(例如:333、111、222,每次只能将每个数字递减或递增1)。但仅打印生成序列所需步骤较少的数字序列,并打印生成该序列所需步骤的数量 说明: 输入:正整数N(例如:312) 将数字(312)转换为3的序列 3 2 2 3 3 2 三三三 这里的步骤数=3 现在,将数字(312)转换为1的序列 2 1 2 1 1 2 11 这里的步骤
<?php
$num = 312;
$arr_num = array_map('intval', str_split($num));
//steps taken for each sequence will be stored in this array
$steps = array();
//printing number
for($i = 0; $i < count($arr_num); $i++)
echo $arr_num[$i];
//calculation
for($i = 0; $i < count($arr_num); $i++) {
$count = 0;
for($j = 0; $j < count($arr_num); $j++) {
if($arr_num[$i] == $arr_num[$j])
++$j;
elseif($arr_num[$i] > $arr_num[$j]) {
while($arr_num[$j] != $arr[$i]) {
$arr_num[$j] += 1;
$count++;
}
}
else {
while($arr_num[$j] != $arr_num[$i]) {
$arr_num[$j] -= 1;
$count++;
}
}
}
//pushing the count to steps array for each sequence
array_push($steps, $count);
}
//I am stuck here...can't find the further solution
?>
这是有效的(根据我的快速测试):
$intIn=312;
#函数changeDigits($intIn){//取消对函数的注释
$digits=str_split($intIn);//转换为数字数组
$numerOfDigits=计数($digits);
$numberOfSteps=array();
#检查数字中的每个数字
对于($i=0;$i<$numerOfDigits;$i++){
$numberOfSteps[$i]=0;
$currentDigit=$digits[$i];
#计算递增/递减数,将其他数字更改为该数字
foreach($otherDigit作为$otherDigit的数字){
如果($currentDigit>$otherDigit)$numberOfSteps[$i]+=$currentDigit-$otherDigit;
如果($currentDigit<$otherDigit)$numberOfSteps[$i]+=$otherDigit-$currentDigit;
}
}
$digitKey=数组搜索(最小($numberOfSteps),$numberOfSteps);
回显“步骤数:”。$numberOfSteps[$digitKey].PHP_EOL;//(或“
”)
回显“newnumber=”.str_repeat($digits[$digitKey],$numberofdigits);
#}
#更改数字(312);
我开发了这个代码。请看一下
<?php
function find_output($input)
{
$digits = str_split($input);
foreach ($digits as $index => $d) {
$new_array = $digits;
unset($new_array[$index]);
$sum = 0;
foreach ($new_array as $value) {
$sum += abs($d - $value);
}
$final_array[$d] = $sum;
}
$steps = min($final_array);
echo "steps : " . $steps . '<br>';
$final_value = array_search(min($final_array), $final_array);
echo "Output: " . implode(array_fill(0, count($digits), $final_value));
}
find_output(819);
?>
我想这就行了
<?php
$input = 312;
$input_array = [];
for($x=0;$x<3;$x++) {
array_push($input_array,strval($input)[$x]);
}
function equalize($input_array, $mark) {
$i = 0;
for($x=0;$x<count($input_array);$x++) {
$input_array[$x] = intval($input_array[$x]);
#print($input_array[$x]);
while($input_array[$x] != $mark) {
if($input_array[$x] < $mark) {
$input_array[$x] = $input_array[$x] + 1;
$i++;
}
else {
$input_array[$x] = $input_array[$x] - 1;
$i++;
}
}
}
$output_val = intval($input_array[0] .$input_array[1] .$input_array[2]);
return $output = [$output_val,$i];
}
#to first
$mark = $input_array[0];
$output = equalize($input_array, $mark);
#to second
$mark = $input_array[1];
$data = equalize($input_array, $mark);
if($data[1] < $output[1]) {
$output = $data;
}
#to last
$mark = $input_array[2];
$data = equalize($input_array, $mark);
if($data[1] < $output[1]) {
$output = $data;
}
echo 'Digit: ' .$output[0] .'<br/>';
echo 'Number of steps: ' .$output[1];
?>
输出:
array (
'input' => '312',
'solutions' =>
array (
0 =>
array (
'sequence' => '222',
'steps' => 2,
),
),
)
array (
'input' => '334',
'solutions' =>
array (
0 =>
array (
'sequence' => '333',
'steps' => 1,
),
),
)
array (
'input' => '39',
'solutions' =>
array (
0 =>
array (
'sequence' => '33',
'steps' => 6,
),
1 =>
array (
'sequence' => '99',
'steps' => 6,
),
),
)
@你能帮我解决吗?像“19”这样的序列怎么样?
<?php
class SeqSolver
{
public function solve($str_num)
{
if(!ctype_digit($str_num))
throw new Exception('Invalid input. Input string must contain digits between 0 and 9 only.');
$digits = str_split($str_num);
$length = count($digits);
foreach(array_unique($digits) as $digit)
$results[$digit] = $this->stepsToSequence($str_num, $digit);
//var_export($results);
$min_keys = array_keys($results, min($results));
// Prepare result
$result['input'] = $str_num;
foreach($min_keys as $key)
$result['solutions'][] = [
'sequence' => str_repeat($key, $length),
'steps' => $results[$key]
];
return $result;
}
public function stepsToSequence($str_num, $target_digit) {
$digits = str_split($str_num);
$steps = 0;
foreach($digits as $digit)
$steps += abs($digit - $target_digit);
return $steps;
}
}
$solver = new SeqSolver;
foreach(['312', '334', '39'] as $input) {
$result = $solver->solve($input);
var_export($result);
echo "\n";
}
array (
'input' => '312',
'solutions' =>
array (
0 =>
array (
'sequence' => '222',
'steps' => 2,
),
),
)
array (
'input' => '334',
'solutions' =>
array (
0 =>
array (
'sequence' => '333',
'steps' => 1,
),
),
)
array (
'input' => '39',
'solutions' =>
array (
0 =>
array (
'sequence' => '33',
'steps' => 6,
),
1 =>
array (
'sequence' => '99',
'steps' => 6,
),
),
)