假设给定一个正整数类型的数字,例如:312。请帮助我用PHP编写一个程序,将给定数字转换为具有相同数字位数和该新数字的所有数字的新数字必须等于给定数字的任何数字(例如:仅通过一次将每个数字减1或增加1来使其等于333、111、222)。但是,只打印该数字序列,该数字序列生成序列所需的步数较少,并且还打印生成该序列所需的步数。
说明: 输入:正整数N(例如312)
将数字(312)转换为3的序列
3 2 2
3 3 2
3 3 3
此处步数= 3
现在,将数字(312)转换为1的序列
2 1 2
1 1 2
1 1 1
此处步数= 3
最后将数字(312)转换为2的序列
2 1 2
2 2 2
此处步数= 2
所以,输出:222
步骤数:2
这是我尝试但失败的
library(shiny)
library(rhandsontable)
library(lubridate)
DF = data.frame(baseline = c(as.POSIXct("2019-07-10 14:00:00")), time = c(as.POSIXct("2019-07-10 17:30:00")),interval = c(""), period = c(""))
numberofrows <- nrow(DF)
ui <- basicPage(mainPanel(rHandsontableOutput("hotable1")))
server <- shinyServer(function(input, output, session) {
previous <- reactive({DF})
MyChanges <- reactive({
if(is.null(input$hotable1)){return(previous())}
else if(!identical(previous(),input$hotable1)){
mytable <- as.data.frame(hot_to_r(input$hotable1))
mytable <- mytable[1:numberofrows,]
# test cases
mytable[,1][is.na(mytable[,1])] <- as.POSIXct("2019-07-10 14:00:00")
mytable[,2][is.na(mytable[,2])] <- as.POSIXct("2019-07-10 17:30:00")
mytable[,3] <- as.interval(mytable[,1], mytable[,2], unit="minutes")
mytable[,4] <- as.period(mytable[,3], unit="minute")
mytable
}
})
output$hotable1 <- renderRHandsontable({rhandsontable(MyChanges())})
})
shinyApp(ui, server)
答案 0 :(得分:1)
这有效(根据我的快速测试):
$intIn = 312;
# function changeDigits( $intIn ) { // uncomment for function
$digits = str_split( $intIn ); // convert to array of digits
$numerOfDigits = count($digits);
$numberOfSteps = array();
# check each digit in number
for ($i=0; $i < $numerOfDigits; $i++) {
$numberOfSteps[$i] = 0;
$currentDigit = $digits[$i];
# count the number of inc/decrements to change the other digits to this digit
foreach($digits as $otherDigit) {
if ($currentDigit > $otherDigit) $numberOfSteps[$i] += $currentDigit - $otherDigit;
if ($currentDigit < $otherDigit) $numberOfSteps[$i] += $otherDigit - $currentDigit;
}
}
$digitKey = array_search( min($numberOfSteps), $numberOfSteps );
echo 'Number of Steps: ' . $numberOfSteps[$digitKey] . PHP_EOL; // (or '<br>')
echo 'New number = ' . str_repeat( $digits[$digitKey], $numerOfDigits );
#}
# changeDigits(312);
答案 1 :(得分:1)
Demo 我使用了这段代码。请看一次
<?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);
?>
答案 2 :(得分:1)
DeleteWall
示例用法:
<?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";
}
答案 3 :(得分:0)
我认为这可以完成工作。
<?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];
?>